在上一篇博客,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:张雨生第四张专辑