发送并接收有序广播:
有序广播和标准广播的发送和接收有点类似
不同于标准广播的是,有序广播有接收的顺序,可以截断
此处为了演示效果,我用了两个项目来实现,这两个项目为Test1和Test2
在这两个项目中我分别静态注册了广播接收器,并在其onReceive()方法中弹一个Toast,
接收的广播的action我设置为com.my.broadcast,也就是说这两个项目中的广播接收器只能接收到com.my.broadcast的广播。
如果不清楚静态注册广播接收器的,请参考我的另一篇博客:
https://blog.csdn.net/weixin_43344890/article/details/92788245
在Test1的MainActivity中发送广播,代码如下:
public class MainActivity extends AppCompatActivity {
private Button btn_send;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_send = findViewById(R.id.main_btn_send);
btn_send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.my.broadcast");
sendOrderedBroadcast(intent,null);
}
});
}
}
此处就是点击按钮,并发送一条为com.my.broadcast的广播
此时运行程序,你会发现会弹出两个Toast,因为这条广播被Test1和Test2两个程序都接收到了。
因为Test1发送的是有序广播,所以可以设置优先级,那么我们在Test1的AndroidManifest.xml中设置如下:
<receiver
android:name=".Test.MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="100">
<action android:name="com.my.broadcast" />
</intent-filter>
</receiver>
这边设置了优先级为100,所以Test1可以比Test2先收到广播,那么我们在Test1收到广播后,就在Test1的广播接收器的onReceiver()方法中将广播截断,这样Test2就无法接收到这条广播了。
此处需要注意的是name这个属性值,在receiver标签中,name是广播接收器所在的位置,在action标签中,name是要接收的广播。
代码如下:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "接收自定义广播成功", Toast.LENGTH_SHORT).show();
// 截断广播
abortBroadcast();
}
}
只需要添加 abortBroadcast();这一句话就可以截断了。
在运行程序,此时只会弹出一个Toast,弹出的是Test1广播接收器中的Toast。