有序广播

Android 有序广播 sendOrderedBroadcast

有序广播是和无序广播(普通sendBroadcast)对比的,是串行逐个传递的广播,是面试高频考点

一、有序广播特点

  1. 串行执行(线性传递):接收器按顺序一个接一个接收,必须等前一个接收器处理完,才传给下一个,不是同时收到。
  2. 可以截断:在接收器onReceive()调用abortBroadcast(),广播终止,排在后面所有接收器都收不到这条广播
  3. 优先级决定接收顺序android:priority数值越大优先级越高,越先收到广播
    • 取值范围:-1000 ~ 1000
    • 例子:demo1的priority=100,demo2设置更小的值,那么demo1先接收,demo2后接收
  4. 接收器之间可以携带、修改广播里的数据,向后传递。

注意:无序广播 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()只对有序广播生效;普通无序广播调用这个方法无效。
  • 一旦截断,广播传递链条终止。

五、有序广播完整执行流程

  1. Demo1调用sendOrderedBroadcast发出广播
  2. 系统查找所有匹配Action的广播接收器,按priority从高到低排序
  3. 优先级100(Demo1接收器)先收到 → 执行onReceive
    • 如果里面写abortBroadcast(),直接终止,Demo2(priority50)收不到广播
    • 如果不调用abortBroadcast,广播继续往下传给Demo2接收器
  4. Demo2接收器执行onReceive

对比表

特性无序广播 sendBroadcast有序广播 sendOrderedBroadcast
接收顺序并行,几乎同时接收,无顺序串行,按priority优先级,高优先先接收
广播截断 不可截断,abortBroadcast无效可调用abortBroadcast截断
数据传递无法传递修改的数据给下一个接收者可以修改Intent数据向后传递

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注