Android中广播接收者BroadcastReceiver详解
1. 接收系統的廣播步驟
?
(1)??新建一個類繼承BroadcastReceiver
?
以監聽sd卡狀態的廣播接收者為例
1 public class SdCardBroadcastReceiver extends BroadcastReceiver { 2 3 @Override 4 public void onReceive(Context context, Intent intent) { 5 String action = intent.getAction(); 6 if("android.intent.action.MEDIA_MOUNTED".equals(action)){ 7 System.out.println("sd卡已掛載"); 8 }else if("android.intent.action.MEDIA_UNMOUNTED".equals(action)){ 9 System.out.println("sd卡已卸載"); 10 } 11 } 12 13 }?
形象一點的比喻, 這一步相當于買了個收音機
?
(2)?在清單文件中注冊
?
1 <!-- 相當于裝電池 --> 2 <receiver android:name="com.example.sdbroadcast.SdCardBroadcastReceiver"> 3 <!-- 相當于調頻道 --> 4 <intent-filter> 5 <action android:name="android.intent.action.MEDIA_MOUNTED"/> 6 <action android:name="android.intent.action.MEDIA_UNMOUNTED"/> 7 <data android:scheme="file"/> 8 </intent-filter> 9 </receiver>?
這一步相當于裝電池
?
(3)??在清單文件中添加意圖過濾器,action里寫監聽的內容
?
1 <!-- 相當于調頻道 --> 2 <intent-filter> 3 <action android:name="android.intent.action.MEDIA_MOUNTED"/> 4 <action android:name="android.intent.action.MEDIA_UNMOUNTED"/> 5 <data android:scheme="file"/> 6 </intent-filter>?
這一步相當于調頻道了
?
2. 發送自定義的無序廣播
?
(1) 發送廣播
?
1 public void startBroadcast(View view){ 2 //開啟廣播 3 //創建一個意圖對象 4 Intent intent = new Intent(); 5 //指定發送廣播的頻道 6 intent.setAction("com.example.BROADCAST"); 7 //發送廣播的數據 8 intent.putExtra("key", "發送無序廣播,順便傳遞的數據"); 9 //發送 10 sendBroadcast(intent); 11 }?
(2) 接收廣播
?
新建一個類,繼承BroadcastReceiver
?
1 public class UnorderedReceiver extends BroadcastReceiver { 2 3 @Override 4 public void onReceive(Context context, Intent intent) { 5 String action = intent.getAction(); 6 7 String data = intent.getStringExtra("key"); 8 9 System.out.println("接受到了廣播,action:"+ action +",data:"+data); 10 11 //接受到了廣播,action:com.example.BROADCAST,data:發送無序廣播,順便傳遞的數據 12 } 13 14 }?
記得在清單文件中進行注冊
?
1 <receiver android:name="com.example.selfreceiver.UnorderedReceiver"> 2 <intent-filter> 3 <action android:name="com.example.BROADCAST"/> 4 </intent-filter> 5 </receiver>?
打印出的結果:
?
?
3. 發送自定義的有序廣播
(1) 發送廣播
1 // 發送有序廣播 2 public void sendOrderedBroad(View view) { 3 Intent intent = new Intent(); 4 intent.setAction("com.example.ORDERED"); 5 // 發送無序廣播 6 sendOrderedBroadcast(intent,//意圖動作,指定action動作 7 null, //receiverPermission,接收這條廣播具備什么權限 8 new FinalReceiver(),//resultReceiver,最終的廣播接受者,廣播一定會傳給他 9 null, //scheduler,handler對象處理廣播的分發 10 0,//initialCode,初始代碼 11 "每人發10斤大米,不得有誤!", //initialData,初始數據 12 null//initialExtras,額外的數據,如果覺得初始數據不夠,可以通過bundle來指定其他數據 13 ); 14 }?
在上面的代碼中,廣播發送者發送了一條廣播:"每人發10斤大米,不得有誤!"
?
(2) 接收廣播
?
新建一個類, 繼承BroadcastReceiver,并在清單文件中進行注冊
以下是所有的廣播接收者在清單文件中的注冊
?
?
權限從-1000 至 1000
?
1) 權限高的廣播接收者可以修改廣播,甚至可以終止廣播
?
權限高的廣播接收者1:
?
1 public class ShengReceiver extends BroadcastReceiver { 2 3 @Override 4 public void onReceive(Context context, Intent intent) { 5 6 //獲取廣播的數據 7 String data = getResultData(); 8 9 //修改 10 setResultData("中央下達福利,每人5斤大米"); 11 12 System.out.println("省政府收到指示, data : "+data); 13 } 14 15 }?
在這里, 這個接收者修改廣播為: "中央下達福利,每人5斤大米"
?
權限低的廣播接收者
?
1 public class PeopleReceiver extends BroadcastReceiver { 2 3 @Override 4 public void onReceive(Context context, Intent intent) { 5 //獲取廣播的數據 6 String data = getResultData(); 7 System.out.println("老百姓收到福利,感謝黨, data : "+data); 8 } 9 10 }?
這樣,在控制臺打印出來的信息為:
?
?
權限低的接收者 接收到的廣播就是修改后的了
?
2) 終止廣播
?
權限高的廣播接收者:
?
1 public class ShengReceiver extends BroadcastReceiver { 2 3 @Override 4 public void onReceive(Context context, Intent intent) { 5 6 //獲取廣播的數據 7 String data = getResultData(); 8 9 //也可以終止廣播,權限小的接收者就接收不到廣播了 10 abortBroadcast(); 11 12 System.out.println("省政府收到指示, data : "+data); 13 } 14 15 }?
控制臺打印:
?
權限小的就接收不到廣播了....
?
(3)?resultReceiver
?
可以在廣播發送者的應用中建一個resultReceiver, 用于接收最終到達的廣播,
無論廣播是否終止,都會被resultReceiver接收
?
1 public class FinalReceiver extends BroadcastReceiver { 2 3 @Override 4 public void onReceive(Context context, Intent intent) { 5 String resultData = getResultData(); 6 System.out.println("人民收到的最終福利是: "+ resultData); 7 } 8 9 }?
控制臺打印信息:
?
(終止廣播后):
(修改廣播后):
?
4. 補充:
有序廣播和無序廣播的區別:
?
有序廣播:發送方發出后,幾乎同時到達多個廣播接收者處,某個接收者不能接收到廣播后進行一番處理后傳給下一個接收者,并且無法終止廣播繼續傳播;Context.sendBroadcast(intent);
有序廣播:廣播接收者需要提前設置優先級,優先級高的先接收到廣播,優先級數值為-1000~1000,在AndroidManifest.xml的<intent-filter android:priority="xxx">設置;比如存在3個廣播接收者A、B、C,優先級A>B>C,因此A最先收到廣播,當A收到廣播后,可以向廣播中添加一些數據給下一個接收者(intent.putExtra()),或者終止廣播(abortBroadcast());Context.sendOrderedBroadcast(intent);
?
轉載于:https://www.cnblogs.com/wanghaoyuhappy/p/5292733.html
總結
以上是生活随笔為你收集整理的Android中广播接收者BroadcastReceiver详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: srm 541
- 下一篇: Android之EventBus使用详解