adnroid BroadcastReceiver 分析

一:基本使用

BroadcastReceiver  四大组件之一,项目中频率不是很高,今天专门深入学习下了。
常见使用

1.系统发送电量低,锁屏等。

2.app内部activity与server,activity与activity直接传递数据等。

基本流程

①注册广播事件:注册方式有两种,一种是静态注册,就是在AndroidManifest.xml文件中定义,注册的广播接收器必须要继承BroadcastReceiver;另一种是动态注册,是在程序中使用Context.registerReceiver注册(四大组件中最特别的一个了),注册的广播接收器相当于一个匿名类。两种方式都需要IntentFIlter。
②发送广播事件:通过Context.sendBroadcast来发送,由Intent来传递注册时用到的Action。
③接收广播事件:当发送的广播被接收器监听到后,会调用它的onReceive()方法,并将包含消息的Intent对象传给它。onReceive中代码的执行时间不要超过5s,否则anr
 

二:代码分析

广播是观察者模式,是一种典型的订阅-发布模型。BroadcastReceiver作为四大组件之一,翻译过来就是广播接收者。整个广播机制最核心应该是:广播发送者,广播接收者,广播内容。

所以分析的核心是这三部分

1.广播接收者

Android中想成为一个广播的接收者,需要完成一个注册的过程。BroadcastReceiver的注册可以分为动态注册和静态注册两种。静态注册就是直接写在xml文件中那种,由PMS(PackageManagerService)完成。 从动态注册入手。AMS(
ActivityManagerService 简称AMS,是Android内核的核心功能之一,在系统启动SystemServer时启动此服务。 BroadcastReceiver没有进程中通信的能力,要依靠InnerReceiver完成和AMS的通信。所以BroadcastReceiver和InnerReceiver是成对存在的

LoadedApk维护全局变量mReceivers,确保每个Context对象中广播接收者的唯一性

广播接收者的核心注册逻辑是在AMS中完成的

2.广播发送者

发送的核心逻辑是在AMS中完成的

发送过程要通过Binder接口IIntentReceiver把广播消息传到原来进程中的BroadcastReceivcer的回调函数onReceive

3.广播内容

广播的载体是Intent,我们只要分析下Intent就知道广播可以发送哪些类型。

4.广播消息流转过程

进程A发送广播消息并携带IntentFilter通过Binder接口,以IPC的方式进入AMS。AMS遍历存储的广播接收者,通过IntentFilter等一系列筛选后,通过第二次IPC过程,借助Binder对象InnerReceiver回到接收者的进程,回调BroadcastReceivcer的回调函数onReceive。而在消息的流转过程中,消息的内容一直静静的躺在Intent里

    原文作者:追梦者_wang
    原文地址: https://blog.csdn.net/wang_8649/article/details/77968948
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞