实现原理
1 采用的模型
Android
中的广播使用了设计模式中的观察者模式:基于消息的发布 / 订阅事件模型
因此,Android将广播的发送者 和 接收者 解耦,使得系统方便集成,更易扩展
2 模型讲解
-
模型中有3个角色:
- 消息订阅者(广播接收者)
- 消息发布者(广播发布者)
- 消息中心(
AMS
,即Activity Manager Service
)
-
示意图 & 原理如下
广播的插件化方案
方案一:转发
Android插件化-Broadcast篇 - 掘金
相较于Activity和Service插件化来说,Receiver的插件化则稍显简单;我们只需要通过PackageParser类中的parsePackage方法解析出插件中的静态注册的广播,接着预埋在宿主中的广播接收器在接收到对应Action广播之后再直接转发给插件中的广播接收器就OK了;而不需要通过反射的方式与Activitythread类打交道。
方案二:静态转为动态广播
Android插件化原理解析——广播的管理 - 知乎
如果不要求广播在应用进程非启动状态就能够接收到,除了上述通过转发的方式进行实现之外,我们还可以在宿主中直接动态注册从插件中解析出来的静态注册广播。
首先,广播并没有复杂的生命周期,它的整个存活过程其实就是一个onReceive回调;而动态广播又不需要在AndroidManifest.xml中预先注册,所以动态注册的BroadcastReceiver其实可以当作一个普通的Java对象;我们完全可以用纯ClassLoader技术实现它——不就是把插件中的Receiver加载进来,然后想办法让它能接受onReceive回调嘛。
可以把静态广播当作动态广播处理
既然都是广播,它们的功能都是订阅一个特定的消息然后执行某个特定的操作,我们完全可以把插件中的静态广播全部注册为动态广播,这样就解决了静态广播的问题。当然,这样也是有缺陷的,静态BroadcastReceiver与动态BroadcastReceiver一个非常大的不同之处在于:动态BroadcastReceiver在进程死亡之后是无法接收广播的,而静态BroadcastReceiver则可以——系统会唤醒Receiver所在进程;这算得上缺陷之二,当然,瑕不掩瑜。
静态广播非静态的实现
步骤一、解析
要把插件中的静态BroadcastReceiver当作动态BroadcastReceiver处理,我们首先得知道插件中到底注册了哪些广播;这个过程归根结底就是获取AndroidManifest.xml中的<receiver>标签下面的内容,我们可以选择手动解析xml文件;这里我们选择使用系统的 PackageParser 帮助解析
步骤二、注册
我们已经解析得到了插件中静态注册的BroadcastReceiver的信息,现在我们只需要把这些静态广播动态注册一遍就可以了;但是,由于BroadcastReceiver的实现类存在于插件之后,我们需要手动用ClassLoader来加载它。