【朝花夕拾】Broadcast篇

       笔者最近在探究ANR及源码的过程中,发现对Broadcast的一些应用层面上的知识有的感觉比较生疏,有的记忆不准确,有的认识不完整。所谓“基础不牢,地动山摇”,于是就梳理了一下Broadcast的一些知识点,查漏补缺,加深对它的全面认识。该篇文章是基于源码、官网、工作经验以及实验结果完成的,阅读本文需要一定的基础,如果是初学者,理解起来可能有一定的难度,需要一定的耐心。

 

一、整体认识

       广播是一个全局的监听器,可以监听者整个系统,也可以监听者整个app。一般我们说“广播是Android的四大组件之一”,但准确点说应该是“广播接收者(Broadcast Receiver)是Android的四大组件之一”,它也是四大组件中最简单的一个。但“麻雀虽小,五脏俱全”,广播有着自己的生命周期,有着丰富的类型,对性能有着巨大的影响,能用于跨进程通信和进程内组件间通信,是系统ANR发送的根源之一......

       Android开发者官网中对广播的介绍以及开发者帮助文档如下:【Broadcasts overview】【BroadcastReceiver开发帮助文档】。

 

二、基本原理

       广播的实现使用了设计模式中的观察者模式,基于消息的发布/订阅事件模型,这其中有3个角色:(1)消息发布者(广播发送者);(2)消息中心(AMS:Activity Manager Service);(3)消息订阅者(广播接收者)。这使得广播的发送者和接收者高度解耦,使用非常方便。以下序列图(不是严格意义上的序列图,勿喷)显示了广播实现的基本流程及原理,其中第一步,第二步,第四步需要开发者手动来完成,其他的由系统自动完成。广播的发送和接收是需要消息,广播发送后,不确定一定有接收者,也不确定接收者什么时候会接收到。

 

【朝花夕拾】Broadcast篇

图2.1 广播实现及原理流程图

 

三、广播的注册

       广播的注册方式有静态注册和动态注册之分,静态注册是指在AndroidManifest.xml中进行注册,动态注册是指在代码中进行注册。

  1、静态注册

      从Android8.0开始,系统对静态注册增加了很大的限制,很多以往版本能够正常使用的静态注册的广播,从该版本开始很可能就会失效。这一点在后文中“不同Android系统版本中广播机制的重要变迁”这一节中会详细介绍,这里不赘述。

  (1)静态注册中的属性简介

       Android开发者官网【receiver属性】【intent-filter属性】中对这些属性做了详细的说明,咱们这里做一些翻译及补充。

1 <receiver 2 android:directBootAware=["true" | "false"] 3 android:enabled=["true" | "false"] 4 android:exported=["true" | "false"] 5 android:icon="drawable resource" 6 android:label="string resource" 7 android:name=".MBroadcastReceiver" 8 android:permission="string" 9 android:process="string" > 10 <intent-filter android:icon="drawable resource" 11 android:label="string resource" 12 android:priority="integer"> 13 <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 14 </intent-filter> 15 </receiver>

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssspj.html