Android-有序广播是可以中断的

历览千载书,时时见遗烈。这篇文章主要讲述Android-有序广播是可以中断的相关的知识,希望能为你提供帮助。
在之前的博客,Android-广播概念,中介绍了(广播和广播接收者)可以组件与组件之间进行通讯,有两种类型的广播(无序广播 和 有序广播),这篇博客就来讲解有序广播的代码实现:
 
有序广播:接收者  可以自己设置接受的顺序,所以叫有序广播
 
【Android-有序广播是可以中断的】有序广播是可以中断的,而指定某个接收者的有序广播是无法中断的
 
在androidManifest.xml订阅 两个接收者

< !-- 订阅(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 = https://www.songbingjia.com/android/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 接收者
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) { 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 = https://www.songbingjia.com/android/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())) { // 做相应的业务逻辑处理 // ... } } }

 
发送有序广播send:
/** * 发送有序广播 */ 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", "奥林匹克风歌曲"); // 而外携带值// 参数一:意图参数二:谁能接收我的广播(自定义权限) sendOrderedBroadcast(intent, null); }

 
没在  MyBroadcastReceiver2 加入中断的日志
12-17 08:49:52.885 4872-4872/liudeli.croadcast1 D/MyBroadcastReceiver: 【222222222】intent.getAction():my.MyBroadcastReceiver.custom.action
12-17 08:49:52.885 4872-4872/liudeli.croadcast1 D/MyBroadcastReceiver: 【222222222】intent.getDataString():OOO:四环奥迪,五环奥运
12-17 08:49:52.887 4872-4872/liudeli.croadcast1 D/MyBroadcastReceiver: 【1111111111】intent.getAction():my.MyBroadcastReceiver.custom.action
12-17 08:49:52.887 4872-4872/liudeli.croadcast1 D/MyBroadcastReceiver: 【1111111111】intent.getDataString():OOO:四环奥迪,五环奥运
 
由于MyBroadcastReceiver2 接收者,优先接受到信息,所以在  MyBroadcastReceiver2中断广播,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 = https://www.songbingjia.com/android/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())) { // 做相应的业务逻辑处理 // ... } } }

 
在  MyBroadcastReceiver2 加入中断的日志
12-17 08:56:36.008 5070-5070/liudeli.croadcast1 D/MyBroadcastReceiver: 【222222222】intent.getAction():my.MyBroadcastReceiver.custom.action
12-17 08:56:36.008 5070-5070/liudeli.croadcast1 D/MyBroadcastReceiver: 【222222222】intent.getDataString():OOO:四环奥迪,五环奥运
 

    推荐阅读