Android-有序廣播明確指定接收者
在上一篇部落格,Android-有序廣播是可以中斷的,介紹了 有序廣播是可以中斷的,但還有一種例外情況:明確指定接收者的有序廣播是無法中斷的,一定會發送到指定的接收者
AndroidManifest.xml形式訂閱兩個接收者,兩個接收者的 action/data一模一樣,只是優先順序不一樣
MyBroadcastReceiver2 優先順序 600 會先接收到
MyBroadcastReceiver1 優先順序 200 會後接收到
<!-- 訂閱(Xml形式訂閱接收者) 注意:訂閱的是接收者,和廣播發送沒有半毛錢關係--> <receiver android:name=".br.MyBroadcastReceiver1"> <intent-filter android:priority="200"> <!-- 設定優先級別為 200 (最大100 / 最小 -1000) --> <!-- Action這是必寫的 --> <action android:name="my.MyBroadcastReceiver.custom.action"/> <!-- 這個可有可無,一旦加了,傳送者也必須要設定 --> <data android:scheme="OOO" /> <!-- 注意:這裡不能加 : --> </intent-filter> </receiver> <!-- 訂閱(Xml形式訂閱接收者) 注意:訂閱的是接收者,和廣播發送沒有半毛錢關係 --> <receiver android:name=".br.MyBroadcastReceiver2"> <intent-filter android:priority="600"> <!-- 設定優先級別為 600 (最大100 / 最小 -1000) --> <!-- Action這是必寫的 --> <action android:name="my.MyBroadcastReceiver.custom.action" /> <!-- 這個可有可無,一旦加了,傳送者也必須要設定 --> <data android:scheme="OOO" /> <!-- 注意:這裡不能加 : --> </intent-filter> </receiver>
MyBroadcastReceiver1
package liudeli.croadcast1.br; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; /** * 定義 接收者 */ public class MyBroadcastReceiver1 extends BroadcastReceiver { private final String TAG = "MyBroadcastReceiver"; /** * 接收的方法 * @param context 傳遞過來的上下文 * @param intent 傳遞過來的意圖,可以獲取很多資訊 */ @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "【1111111111】intent.getAction():" + intent.getAction()); Log.d(TAG, "【1111111111】intent.getDataString():" + intent.getDataString()); // 真實開發中是這樣寫的 if ("my.MyBroadcastReceiver.custom.action2".equals(intent.getAction())) { String data = intent.getDataString(); String[] dataArray = data.split(":"); Log.d(TAG, "【1111111111】data:" + dataArray[1]); Log.d(TAG, "【1111111111】music:" + intent.getStringExtra("music")); } else if ("xxx.action".equals(intent.getAction())) { // 做相應的業務邏輯處理 // ... } else if ("xxx.action".equals(intent.getAction())) { // 做相應的業務邏輯處理 // ... } } }
MyBroadcastReceiver2 在 onReceive()方法 中斷廣播 abortBroadcast();
package liudeli.croadcast1.br; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; /** * 定義 接收者 */ public class MyBroadcastReceiver2 extends BroadcastReceiver { private final String TAG = "MyBroadcastReceiver"; /** * 接收的方法 * @param context 傳遞過來的上下文 * @param intent 傳遞過來的意圖,可以獲取很多資訊 */ @Override public void onReceive(Context context, Intent intent) { /** * 中斷廣播 */ abortBroadcast(); Log.d(TAG, "【222222222】intent.getAction():" + intent.getAction()); Log.d(TAG, "【222222222】intent.getDataString():" + intent.getDataString()); // 真實開發中是這樣寫的 if ("my.MyBroadcastReceiver.custom.action2".equals(intent.getAction())) { String data = intent.getDataString(); String[] dataArray = data.split(":"); Log.d(TAG, "【222222222】data:" + dataArray[1]); Log.d(TAG, "【222222222】music:" + intent.getStringExtra("music")); } else if ("xxx.action".equals(intent.getAction())) { // 做相應的業務邏輯處理 // ... } else if ("xxx.action".equals(intent.getAction())) { // 做相應的業務邏輯處理 // ... } } }
傳送廣播
傳送明確指定(MyBroadcastReceiver1) 的廣播
/** * 傳送有序廣播 明確指定MyBroadcastReceiver1接收者 */ public void sendOrderBroadcast(View view) { /** * 兩個接收者在AndroidManifest.xml是這樣訂閱的:怎麼訂閱,就怎麼傳送 * <intent-filter> * <!-- Action這是必寫的 --> * <action android:name="my.MyBroadcastReceiver.custom.action" /> * * <!-- 這個可有可無,一旦加了,傳送者也必須要設定 --> * <data android:scheme="OOO" /> <!-- 注意:這裡不能加 : --> * </intent-filter> */ Intent intent = new Intent(); intent.setAction("my.MyBroadcastReceiver.custom.action"); intent.setData(Uri.parse("OOO:張雨生第四張專輯")); // 注意:要加 : intent.putExtra("music", "大海歌曲"); // 而外攜帶值 /** * 引數三:明確指定 接收者 MyBroadcastReceiver1 */ sendOrderedBroadcast(intent, // 意圖 null, // 誰能接收我的廣播(自定義許可權) new MyBroadcastReceiver1(), // 可以指定的 接收者 null, // 用於處理的Handler 9, // 初始化Code null, // 初始化資料 null // Bundle攜帶的引數 ); }
Log日誌:【222222222】的優先順序最高 先接收到廣播(然後中斷廣播), 【1111111111】還可以接收到廣播 (是因為【1111111111】是明確指定的 接收者,一定會接收到)
12-17 19:54:54.987 2374-2374/liudeli.croadcast1 D/MyBroadcastReceiver: 【222222222】intent.getAction():my.MyBroadcastReceiver.custom.action
12-17 19:54:54.987 2374-2374/liudeli.croadcast1 D/MyBroadcastReceiver: 【222222222】intent.getDataString():OOO:張雨生第四張專輯
12-17 19:54:54.987 2374-2374/liudeli.croadcast1 D/MyBroadcastReceiver: 【1111111111】intent.getAction():my.MyBroadcastReceiver.custom.action
12-17 19:54:54.987 2374-2374/liudeli.croadcast1 D/MyBroadcastReceiver: 【1111111111】intent.getDataString():OOO:張雨生第四張專輯