(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
(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>
打印出的結果:
(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 }
控制檯打印信息:
(終止廣播後):
(修改廣播後):
有序廣播和無序廣播的區別:
有序廣播:發送方發出後,幾乎同時到達多個廣播接收者處,某個接收者不能接收到廣播後進行一番處理後傳給下一個接收者,而且沒法終止廣播繼續傳播;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);