Android学习笔记(十二)BroadcastReceiver的有序广播和优先级

  前两篇博文中简单整理了普通广播,其实还有有序广播,有序广播在开发中也是比不可少的,可以给广播接收者设定优先级来控制接受顺序,并却可以中断广播传递等等。

一、两种Broadcast:

· 普通广播(Normal Broadcast):用sendBroadcast()方法发送。

  普通广播是完全异步的,逻辑上可以在同一时刻被所有匹配的接受者接收到,消息传递效率高,缺点是接受者不能将处理结果传递给下一个接收者,也无法终止广播传播。

· 有序广播(Ordered Broadcast):用sendOrderedBroadcast()方法发送。

  有序广播的接收者们将按照事先生命的优先级依次接收,数越大优先级越高(取值范围:-1000~10000),优先级可以声明在<intent-filter android:priority="n".../>,也可以调用IntentFilter对象的setPriority设置。并且接收者可以终止传播(调用abortBroadcast()方法即可终止),一旦终止后面接收者就无法接受广播。另外,接受者可以将处理结果存入数据(可通过setResultExtras(Bundle)方法将数据存入Broadcast),当做Broadcast再传递给下一级接收者(可通过代码Bundle bundle = getResultExtras(true)获取上一级传递过来的数据)。

  短信拦截原理:系统收到短信,发出的Broadcast属于有序广播,程序就可以通过设定优先级先接收到通知,然后终止传递。

二、举个例子(有序广播):

  1、首先创建两个BroadcastReceiver。让第一个receive接收到广播后中断。

  MyReceiver.java

1 public class MyReceiver extends BroadcastReceiver {
2 
3     @Override
4     public void onReceive(Context context, Intent intent) {
5         System.out.println("MyReceiver接受到消息");
6         abortBroadcast(); //中断广播,不会再响比它有优先级低得广播再传播下去了
7     }
8 }

  MyReceiver1.java

1 public class MyReceiver1 extends BroadcastReceiver {
2 
3     @Override
4     public void onReceive(Context context, Intent intent) {
5         System.out.println("MyReceiver1接受到消息");
6     }
7 }

  2、然后将两个receiver的action在AndroidManifest.xml文件中配置成一样的,并且设置成不同的优先级,代码如下:

 1      <receiver android:name=".MyReceiver">
 2             <!-- priority优先级:数字越高优先级越高 -->
 3             <intent-filter android:priority="5" >
 4                 <action android:name="com.codingblock.myreceiver.intent.action.MyReceiver"/>
 5             </intent-filter>
 6         </receiver>
 7         <receiver android:name=".MyReceiver1">
 8             <intent-filter android:priority="4">
 9                 <action android:name="com.codingblock.myreceiver.intent.action.MyReceiver"/>
10             </intent-filter>
11         </receiver>

  3.最后在MainActivity中发送广播

 1 public class MainActivity extends Activity {
 2 
 3     Button btn_send_receiver;
 4     @Override
 5     protected void onCreate(Bundle savedInstanceState) {
 6         super.onCreate(savedInstanceState);
 7         setContentView(R.layout.activity_main);
 8         btn_send_receiver = (Button)findViewById(R.id.btn_send_receiver);
 9         btn_send_receiver.setOnClickListener(new OnClickListener() {
10             
11             @Override
12             public void onClick(View v) {
13                 Intent intent = new Intent();
14                 intent.setAction("com.codingblock.myreceiver.intent.action.MyReceiver");
15                 sendOrderedBroadcast(intent, null);//有序广播需要用sendOrderedBroadcast()方法发送
16             }
17         });
18     }
19 }

  布局文件只有一个Button,比较简单,在此就不贴出了。

  通过运行测试就会发现,点击发送消息按钮后只有MyReceiver接收到了消息,广播就被中断了。日志如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术小黑屋

探究android:largeHeap

在日常的Android开发中,我们必然遇到过OutOfMemoryError这样的崩溃,产生的原因无外乎两点,一是内存过小不够用,二是程序设计有误,导致不能释放...

1003
来自专栏何俊林

插件开发之360 DroidPlugin源码分析(三)Binder代理

Hook机制中Binder代理类关系图 Hook机制中Binder代理时序图 MyServiceManager ServiceManagerCacheBinde...

1849
来自专栏飞雪无情的博客

Go语言实战笔记(二十)| Go Context

控制并发有两种经典的方式,一种是WaitGroup,另外一种就是Context,今天我就谈谈Context。

1153
来自专栏aCloudDeveloper

UNIX环境高级编程笔记之高级I/O

  本章说明了很多高级I/O功能: 非阻塞I/O——发一个I/O操作,不使其阻塞,记录锁,STREAMS机制 I/O多路转接——select和poll函数 re...

1907
来自专栏数据之美

一例 jvm file.encoding 属性引起的 MapReduce/HBase 乱码问题

1、问题: 最近在往 HBase 写中文的时候,发现 hbase 查出来的数据会有部分中文乱码了,而部分中文又是正常的,按理来说,一般的乱码问题要么全乱,要么不...

2199
来自专栏Android-JessYan

你不知道的Retrofit缓存库RxCache前言简介使用详解总结

1012
来自专栏Android开发指南

Android开发艺术探究Note

2727
来自专栏MelonTeam专栏

浅析Binder机制

一个老生常谈的话题,但也是在Android学习过程中一定会遇到的一个主题。结合自己的学习历程分享一下我对Binder架构的基本理解吧。 刚开始学习的时候,并没...

20610
来自专栏开发之途

Android IPC机制(1)-序列化机制

1255
来自专栏Golang语言社区

GoLang并发控制(下)

context的字面意思是上下文,是一个比较抽象的词,字面上理解就是上下层的传递,上会把内容传递给下,在go中程序单位一般为goroutine,这里的上下文便是...

403

扫码关注云+社区