• 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的方式。

  • 相关阅读:
    Vue创建全局、局部组件及父组件向子组件传递方法
    DSPE-PEG-R6H4 PEG-R6H4-DSPE R6H4-DSPE-PEG 磷脂-聚乙二醇-PH响应性穿膜肽R6H4的介绍
    Java线程池的任务消息队列
    软件测试-基本概念
    11.24总结二叉树
    Smart Document Control——杜绝文件成堆和文件混乱,保证业务连续性,创建企业新阶段
    vue 样式加scoped不起作用 局部更改element-ui的默认样式
    COCO数据集介绍
    Spring监听器-spring源码详解(五)
    Python学习笔记--字符集
  • 原文地址:https://blog.csdn.net/taoyuxin1314/article/details/126281636