• Android四大组件之BroadcastReceiver(三)


    上一篇讲了如何动态注册广播、如何静态注册广播,以及两者之间的区别,文章链接如下:

    Android四大组件之BroadcastReceiver(二)_水很清的博客-CSDN博客

    接下来讲一下有序广播中对广播的拦截、有序广播与标准广播的区别、广播的安全性问题

    一、有序广播

    上一篇已经讲过,有序广播是同步的,同一个时刻只有一个接收者接收广播,当该接收者处理完事务后广播才会继续往下传播,但是当前的接收者也可以对广播进行一个拦截截断,使广播到了自己后就完成使命,不会继续传播。

    在这一点有点类似于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的方式。

  • 相关阅读:
    饥饿游戏搜索算法(HGS)(含java实现代码)
    【NSDictionary数组的遍历 Objective-C语言】
    生死时速,分秒必争
    Javascript自定义页面复制事件
    极智AI | 算法部署中需要注意的Lazy Loading
    iPhone 拨打分机号码
    大数据基础设施搭建 - Flink
    作业-11.29
    宏鑫科技在创业板过会:前三季度收入约7亿元,王文志为实控人
    关于FPGA对 DDR4 (MT40A256M16)的读写控制 3
  • 原文地址:https://blog.csdn.net/taoyuxin1314/article/details/126281636