介绍
所谓有序广播,即存在一个发送方和众多接收方,接收方按照前后顺序排列,从第一个接收方接收并处理后依次向后传递;
类似于路由守卫,这意味着中间的任意一个接收方都可以截断广播从而阻止后续的接收方接收信息!
基本环境搭建
鉴于之前我们已经学习过简单的broadcast配置,这里就不做过多赘述,请按照如下代码搭建好默认的测试环境;
发送方页面配置
和上一章不同的是,这里使用sendOrderedBroadcast来注册有序广播,他接受的第二个参数我们一般填写null,第一个参数仍然是一个intent;
代码清单 BroadcastOrderActivity.java
public class BroadcastOrderActivity extends AppCompatActivity {
public static final String ORDER_ACTION = "com.zhiyiyi.broadcast.order";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broadcast_order);
findViewById(R.id.btn_order).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.zhiyiyi.broadcast.order");
sendOrderedBroadcast(intent,null);
}
});
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onStop() {
super.onStop();
}
}
配置两个一样的接收者模块
下面下的是接收者First的代码,接收者Second的代码和这个完全一样,你直接copy就好;
代码清单 receiver/OrderFirstReceiver.java
public class OrderFirstReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 因为发送页面已经定义好action常量,我们这里直接调用即可!
if (intent != null && intent.getAction().equals(BroadcastOrderActivity.ORDER_ACTION)) {
Log.d("receiver", "onReceive: first");
}
}
}
配置有序接收
因为这里的广播是有序接受的,会有以下两个接收的规则:
- 当接收者同时注册时(且不设置权限值时),注册快的那一个先接受,慢的后接收;
- 当设置权限值时,高权限的先接收
@Override
protected void onStart() {
super.onStart();
firstReceiver = new OrderFirstReceiver();
IntentFilter firstFilter = new IntentFilter(ORDER_ACTION);
firstFilter.setPriority(1); // 优先级1,小于2,后接收
registerReceiver(firstReceiver,firstFilter);
secondReceiver = new OrderSecondReceiver();
IntentFilter secondFilter = new IntentFilter(ORDER_ACTION);
secondFilter.setPriority(2); // 优先级2大于1,先接收
registerReceiver(secondReceiver,secondFilter);
}
// 别忘了销毁两个接收者!
@Override
protected void onStop() {
super.onStop();
unregisterReceiver(firstReceiver);
unregisterReceiver(secondReceiver);
}
截停广播
在任意一个接收者的onReceive方法里填写abortBroadcast即可截停
@Override
public void onReceive(Context context, Intent intent) {
// 因为发送页面已经定义好action常量,我们这里直接调用即可!
if (intent != null && intent.getAction().equals(BroadcastOrderActivity.ORDER_ACTION)) {
abortBroadcast(); // 在此处截停广播
}
}
END 下一章将会带大家更进一步的了解Android广播的其他的使用方法!!!