2023年3月25日(软件工程日报)

发布时间 2023-03-25 19:22:31作者: 摆烂达人
由于广播没指定唯一的接收者,因此可能存在多个接收器,每个接收器都拥有自己的处理逻辑。这种机
制固然灵活,却不够严谨,因为不同接收器之间也许有矛盾。
1)一个广播存在多个接收器,这些接收器需要排队收听广播,这意味着该广播是条有序广播。
2)先收到广播的接收器A,既可以让其他接收器继续收听广播,也可以中断广播不让其他接收器收
听。
至于如何实现有序广播的收发,则需完成以下的3个编码步骤:
1.发送广播时要注明这是个有序广播
之前发送标准广播用到了sendBroadcast方法,可是该方法发出来的广播是无序的。只有调用
sendOrderedBroadcast方法才能发送有序广播,具体的发送代码示例如下:
(完整代码见chapter09\src\main\java\com\example\chapter09\BroadOrderActivity.java)
2.定义有序广播的接收器
接收器的定义代码基本不变,也要从BroadcastReceiver继承而来,唯一的区别是有序广播的接收器允
许中断广播。倘若在接收器的内部代码调用abortBroadcast方法,就会中断有序广播,使得后面的接收
器不能再接收该广播。下面是有序广播的两个接收器代码例子:
Intent intent = new Intent(ORDER_ACTION); // 创建一个指定动作的意图
sendOrderedBroadcast(intent, null); // 发送有序广播
private OrderAReceiver orderAReceiver; // 声明有序广播接收器A的实例
// 定义一个有序广播的接收器A
private class OrderAReceiver extends BroadcastReceiver {
// 一旦接收到有序广播,马上触发接收器的onReceive方法
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null && intent.getAction().equals(ORDER_ACTION)) {
String desc = String.format("%s%s 接收器A收到一个有序广播\n",tv_order.getText().toString(),
DateUtil.getNowTime());
tv_order.setText(desc);
if (ck_abort.isChecked()) {
abortBroadcast(); // 中断广播,此时后面的接收器无法收到该广播
}
}
}
}
private OrderBReceiver orderBReceiver; // 声明有序广播接收器B的实例
// 定义一个有序广播的接收器B
private class OrderBReceiver extends BroadcastReceiver {
// 一旦接收到有序广播B,马上触发接收器的onReceive方法
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null && intent.getAction().equals(ORDER_ACTION)) {
String desc = String.format("%s%s 接收器B收到一个有序广播\n",
tv_order.getText().toString(),
DateUtil.getNowTime());
tv_order.setText(desc);
if (ck_abort.isChecked()) {
abortBroadcast(); // 中断广播,此时后面的接收器无法收到该广播
}
}
}
}
3.注册有序广播的多个接收器
接收器的注册操作同样调用registerReceiver方法,为了给接收器排队,还需调用意图过滤器的
setPriority方法设置优先级,优先级越大的接收器,越先收到有序广播。如果不设置优先级,或者两个
接收器的优先级相等,那么越早注册的接收器,会越先收到有序广播。譬如以下的广播注册代码,尽管
接收器A更早注册,但接收器B的优先级更高,结果先收到广播的应当是接收器B。
orderAReceiver = new OrderAReceiver(); // 创建一个有序广播的接收器A
// 创建一个意图过滤器A,只处理ORDER_ACTION的广播
IntentFilter filterA = new IntentFilter(ORDER_ACTION);
filterA.setPriority(8); // 设置过滤器A的优先级,数值越大优先级越高
registerReceiver(orderAReceiver, filterA); // 注册接收器A,注册之后才能正常接收广播
orderBReceiver = new OrderBReceiver(); // 创建一个有序广播的接收器B
// 创建一个意图过滤器A,只处理ORDER_ACTION的广播
IntentFilter filterB = new IntentFilter(ORDER_ACTION);
filterB.setPriority(10); // 设置过滤器B的优先级,数值越大优先级越高
registerReceiver(orderBReceiver, filterB); // 注册接收器B,注册之后才能正常接收广播
接下来通过测试页面演示有序广播的收发,如果没要求中断广播,则有序广播的接收界面如图9-3所示,
此时接收器B和接收器A依次收到了广播;如果要求中断广播,则有序广播的接收界面如图9-4所示,此
时只有接收器B收到了广播。