上一篇讲了如何动态注册广播、如何静态注册广播,以及两者之间的区别,文章链接如下:
https://developer.aliyun.com/article/995230?spm=a2c6h.13148508.setting.14.41004f0eRPHDsB
接下来讲一下有序广播中对广播的拦截、有序广播与标准广播的区别、广播的安全性问题
一、有序广播
上一篇已经讲过,有序广播是同步的,同一个时刻只有一个接收者接收广播,当该接收者处理完事务后广播才会继续往下传播,但是当前的接收者也可以对广播进行一个拦截截断,使广播到了自己后就完成使命,不会继续传播。
在这一点有点类似于Android的事件分发机制,事件被消费了,就不会往下传递。截断广播可以直接在接收者的onReceiver方法中调用一下方法:
abortBroadcast();
二、有序广播与标准广播的区别
标准广播:
1、同级别接收者先后是随机的(无序的)
2、级别低的后接收到广播
3、接收器不能截断广播的继续广播,也不能处理广播
4、同级别动态注册高于静态注册
有序广播:
1、同级别接收是随机的(结合下一条)
2、同级别动态注册高于静态注册
3、排序规则为:将当前系统中所有有效的动态注册和静态注册的BroadcastReceiver按照priority属性值从大到小排序
4、先接收的BroadcastReceiver可以对此有序广播进行截断,使后面的BroadcastReceiver不再接收到此广播,也可以对广播进行修改,使后面的BroadcastReceiver接收到广播后解析得到错误的参数值。
三、安全性问题
广播可以跨进程(跨app)通信,且exported属性在有intent-filter的情况下默认值是true,所以可能出现以下的安全隐患
1、其他App可能针对性的发出与当前app intent-filter相匹配的广播,导致app不断的接收到广播并处理
2、其他App可以注册与当前app一样的intent-filter用于接收广播,获取广播具体的信息。
针对以上两种情况,业界常见的一些增加安全性的方案包括:
1、对于应用内部的发送和接收的广播,将exported设置成false,使得非本app内部发出的广播不被接收到。
2、在广播发送和接收时,增加相应的permission,用于权限验证。
3、发送广播时,指定特定广播接收器所在的包名,具体通过intent.setPackage(packageName)指定,这样子此广播将只会发送到此包中app内与之相匹配的有效广播接收器中。
4、采用LocalBroadcastManager的方式。