有序广播(Ordered Broadcast)是Android系统中的一种特殊广播机制,它是Android系统用来在应用程序之间传递消息和数据的方式之一。在Android中,广播分为有序广播(Ordered Broadcast)和无序广播(Unordered Broadcast)。有序广播的特点在于它会按照接收者的优先级顺序逐个分发,而无序广播则是同时分发给所有注册的接收者。
### 有序广播的工作原理
有序广播通过`BroadcastReceiver`组件进行接收。当发送一个有序广播时,Android系统会按照接收者的`android:priority`属性值来决定广播的接收顺序。`android:priority`的默认值为0,数值越大,优先级越高,广播将首先被优先级高的接收者处理。如果两个接收者的优先级相同,则按照它们在AndroidManifest.xml中声明的顺序处理。
### 发送有序广播
发送有序广播通常使用`sendOrderedBroadcast()`方法,如:
```java
Intent intent = new Intent("com.example.ACTION_NAME");
sendOrderedBroadcast(intent, null);
```
在这里,`ACTION_NAME`是你自定义的广播动作,第二个参数可以用于设置权限,限制哪些应用能接收到这个广播。
### 接收有序广播
在`AndroidManifest.xml`中声明`BroadcastReceiver`时,需要指定`android:priority`属性来设定优先级:
```xml
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="com.example.ACTION_NAME"/>
</intent-filter>
<meta-data android:name="android.priority" android:value="100" />
</receiver>
```
或者在代码中动态注册`BroadcastReceiver`时,可以通过`IntentFilter.setPriority()`方法设置优先级。
### 有序广播的生命周期
有序广播的接收者有四个生命周期方法:
1. `onReceive()`:接收广播并执行相应的操作。
2. `onAbortBroadcast()`: 如果你在`onReceive()`中调用了`abortBroadcast()`,系统会调用此方法,表示广播不会继续传递到下一个接收者。
3. `onFinishBroadcast()`: 当广播完成传递或被中止时,系统调用此方法,通常用于清理资源。
4. `onReceiveCompleted()`: 在最后一个接收者处理完广播后调用,仅对拦截广播(BroadcastFilter.intercept()返回true)有意义。
### 有序广播的应用场景
有序广播适用于需要按照特定顺序执行操作或需要接收者间进行交互的情况。例如,当电量低时,系统会发送有序广播,先由系统级别的服务处理,然后是用户级别的应用,这样可以确保关键操作优先执行。
### 注意事项
1. 从Android 8.0(API级别26)开始,系统默认不允许在后台启动应用,包括通过广播启动。因此,对于需要在后台运行的功能,可能需要考虑使用其他机制,如JobScheduler、WorkManager或前台服务。
2. 使用有序广播时,要注意性能问题,因为每个接收者都会阻塞后面的接收者,直到其完成处理。
有序广播是Android系统中一种重要的通信方式,它允许开发者按需控制广播的传递顺序,实现更复杂的逻辑。合理利用有序广播,可以有效地在不同组件之间协调操作,提高应用的灵活性。