Android中廣播接收者BroadcastReceiver詳解

1. 接收系統的廣播步驟

 

(1)  新建一個類繼承BroadcastReceiverandroid

 

以監聽sd卡狀態的廣播接收者爲例ide

 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 }

 

形象一點的比喻, 這一步至關於買了個收音機spa

 

(2) 在清單文件中註冊code

 

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>

 

這一步至關於裝電池xml

 

(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>

 

這一步至關於調頻道了blog

 

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) 接收廣播get

 

新建一個類,繼承BroadcastReceiverit

 

 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);

相關文章
相關標籤/搜索