发送并接收自定义广播在截断让其它程序无法接收到(有序广播)

2023-04-11 08:59:41

发送并接收有序广播:
有序广播和标准广播的发送和接收有点类似
不同于标准广播的是,有序广播有接收的顺序,可以截断

此处为了演示效果,我用了两个项目来实现,这两个项目为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。

  • 作者:冰之沁泠
  • 原文链接:https://blog.csdn.net/weixin_43344890/article/details/92794292
    更新时间:2023-04-11 08:59:41