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 条评论
登录 后参与评论

相关文章

来自专栏腾讯云Elasticsearch Service

Elasticsearch Rest Client实战

Elasticsearch官方推荐使用Java REST客户端连接集群并进行数据操作。

2624
来自专栏wannshan(javaer,RPC)

dubbo集群容错机制代码分析1

dubbo版本2.5.3 我们这里以zookeeper作为注册中心为例说明。 这里说的集群,可以理解为,一个接口服务对应有多个提供者。 在dubbo的调用方(...

3925
来自专栏mukekeheart的iOS之旅

Android基础总结(4)——广播接收器

  在Android中的每个应用程序可以对自己感兴趣的广播进行注册,这样该程序就只会接收自己所关心的广播内容,这些广播可能来自于系统的,也可能来自于其他应用程序...

24710
来自专栏分布式系统进阶

Kafka源码分析-网络层-2

这里面最主要的就是accept(key, processors(currentProcessor)) (4) accept: 设置新连接socket的参数后交...

651
来自专栏Java学习网

如何为可扩展系统进行Java Socket编程

如何为可扩展系统进行Java Socket编程 从简单I/O到异步非阻塞channel的Java Socket模型演变之旅 上世纪九十年代后期,我在一家在线视频...

2888
来自专栏码匠的流水账

聊聊hikari连接池的maxLifetime属性及evict操作

用来标记连接池中的连接不可用,这样在borrow连接的时候,如果是标记evict的,则会继续获取连接

492
来自专栏码匠的流水账

聊聊spring for kafka对producer的封装与集成

本文主要解析一下spring for apache kafka对原生的kafka client producer的封装与集成。

582
来自专栏非著名程序员

玩转EventBus,详解其使用

? 概述 EventBus是一款针对Android优化的发布/订阅(publish/subscribe)事件总线。主要功能是替代Intent,Handler,...

1896
来自专栏编码小白

ofbiz实体引擎(一) 获取Delegator

public abstract class DelegatorFactory implements Factory<Delegator, String> { ...

3105
来自专栏软件工程师成长笔记

用MINA实现UDP通信的例子

Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象...

422

扫码关注云+社区