Android 有序广播 sendOrderedBroadcast
有序广播是和无序广播(普通
sendBroadcast)对比的,是串行逐个传递的广播,是面试高频考点
一、有序广播特点
- 串行执行(线性传递):接收器按顺序一个接一个接收,必须等前一个接收器处理完,才传给下一个,不是同时收到。
- 可以截断:在接收器
onReceive()调用abortBroadcast(),广播终止,排在后面所有接收器都收不到这条广播。 - 优先级决定接收顺序:
android:priority,数值越大优先级越高,越先收到广播。- 取值范围:
-1000 ~ 1000 - 例子:demo1的priority=100,demo2设置更小的值,那么demo1先接收,demo2后接收
- 取值范围:
- 接收器之间可以携带、修改广播里的数据,向后传递。
注意:无序广播 sendBroadcast() 不能截断,没有优先级,多个接收器几乎同时收到
二、发送有序广播代码(发送方Demo1)
Intent intent = new Intent("com.foxdevelop.www.senddemo.MY_BROADCAST");
// 发送有序广播,第二个参数是权限(null代表不做权限限制)
sendOrderedBroadcast(intent, null);
Code language: JavaScript (javascript)
三、静态注册接收器,设置优先级 AndroidManifest.xml
<receiver android:name=".MyReceiver">
<!-- priority 优先级,数字越大越优先接收 -->
<intent-filter android:priority="100">
<action android:name="com.foxdevelop.www.senddemo.MY_BROADCAST"/>
</intent-filter>
</receiver>
Code language: HTML, XML (xml)
Demo2里的接收器设置一个比100小的priority,比如
android:priority="50",执行顺序:Demo1接收器 → Demo2接收器
四、截断广播 abortBroadcast()
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "接收到我们自定义的广播", Toast.LENGTH_LONG).show();
// 截断有序广播!后面优先级更低的接收器,再也收不到这条广播
abortBroadcast();
}
Code language: JavaScript (javascript)
重点:
abortBroadcast()只对有序广播生效;普通无序广播调用这个方法无效。- 一旦截断,广播传递链条终止。
五、有序广播完整执行流程
- Demo1调用
sendOrderedBroadcast发出广播 - 系统查找所有匹配Action的广播接收器,按priority从高到低排序
- 优先级100(Demo1接收器)先收到 → 执行onReceive
- 如果里面写
abortBroadcast(),直接终止,Demo2(priority50)收不到广播 - 如果不调用abortBroadcast,广播继续往下传给Demo2接收器
- 如果里面写
- Demo2接收器执行onReceive
对比表
| 特性 | 无序广播 sendBroadcast | 有序广播 sendOrderedBroadcast |
|---|---|---|
| 接收顺序 | 并行,几乎同时接收,无顺序 | 串行,按priority优先级,高优先先接收 |
| 广播截断 | 不可截断,abortBroadcast无效 | 可调用abortBroadcast截断 |
| 数据传递 | 无法传递修改的数据给下一个接收者 | 可以修改Intent数据向后传递 |
Previous: Android 跨应用接收广播
Next: Android 本地广播