Broadcast Receiver 面试详解

一、广播

1、广播的定义


BroadcastReceiver,中文直译为“广播接收者”,在Android 系统中,广播主要用在组件与组件之间进行消息传递。组件与组件之间可以是同一个进程,也可以是不同进程。既然是可以跨进程的,那么可以想像底层应该是基于Binder来实现的,事实也正是如此。


2、广播的使用场景

3、广播的种类

      4) 有序广播  Ordered Broadcast

拦截可以使用abortBroadCast来拦截。

数据的设置如果是原始广播发送过来的,可以使用intent.getStringExtra("msg")获得原始数据,你可以将新的数据使用setResultExtras()封装传递到下一级去(下一级接收getResultExtras(true)),

也可以使用setResultData()封装数据发送到下一级(下一级使用getResultData()接收)


        5)  粘性广播 Stick Broadcast

粘性消息在发送后就一直存在于系统的消息容器里面,等待对应的处理器去处理,如果暂时没有处理器处理这个消息则一直在消息容器里面处于等待状态,粘性广播的Receiver如果被销毁,那么下次重建时会自动接收到消息数据。

从上面的日志信息可以看出sendStickyBroadcast只保留最后一条广播,并且一直保留下去,这样即使已经处理了这条广播但当再一次注册这条广播后依然可以收到它。


二、实现广播-receiver

1、静态注册:注册完成就一直运行

2、动态注册:跟随activity的生命周期

三、广播实现机制



四、LocalBroadcastManager详解

BroadcastReceiver安全问题

BroadcastReceiver设计的初衷是从全局考虑可以方便应用程序和系统、应用程序之间、应用程序内的通信,所以对单个应用程序而言BroadcastReceiver是存在安全性问题的(恶意程序脚本不断的去发送你所接收的广播)。为了解决这个问题LocalBroadcastManager就应运而生了。

LocalBroadcastManager是Android Support包提供了一个工具,用于在同一个应用内的不同组件间发送Broadcast。LocalBroadcastManager也称为局部通知管理器,这种通知的好处是安全性高,效率也高,适合局部通信,可以用来代替Handler更新UI

好处:

1、因广播数据在本应用范围内传播,你不用担心隐私数据泄露的问题。

2、不用担心别的应用伪造广播,造成安全隐患。

3、相比在系统内发送全局广播,它更高效。




五、Android Broadcast 和 BroadcastReceiver的权限限制

在Android应用开发中,有时会遇到以下两种情况,

1. 一些敏感的广播并不想让第三方的应用收到 ;

2. 要限制自己的Receiver接收某广播来源,避免被恶意的同样的ACTION的广播所干扰。

第一种场景: 谁有权收我的广播?

首先在send app中的Androidmanifest.xml添加

然后,在Sender app发送广播时将此权限作为参数传入,如下:


这样做之后就使得只有具有RECV_XXX权限的Receiver APP才能接收此广播要接收该广播,在Receiver应用的AndroidManifest.xml中要添加对应的RECV_XXX权限。

Receiver APP 广播注册的时候也要添加此权限,否则接受不到消息



第二种场景: 谁有权给我发广播?


备注:Android 8.0取消大部分静态注册的广播


六、BroadcastReceiver之源码分析

Context--ContextImpl-AMS

你可能感兴趣的:(Broadcast Receiver 面试详解)