美文网首页
BroadcastReceiver的启动过程

BroadcastReceiver的启动过程

作者: LeoFranz | 来源:发表于2019-09-29 16:16 被阅读0次

静态广播的注册和其他三大组件一样,由packageManagerService完成的。

动态注册广播的过程

image.png

1、通过ContextWrapper开始,具体实现在ContextImpl,和Activity以及Service的开始过程一致。
2、在ContextImpl中,先从mPackageInfo中获取IIntentReceiver对象,然后采取跨进程的方式向AMS发送广播注册的请求。采用IIntentReceiver的原因是注册过程是跨进程的,BroadCastReceiver作为acitivity内部组件是不能直接跨进程传递的,需要IIntentReceiver中转一下,类似于Service的绑定过程中的ServiceDipatcher。这里会通过mPackageInfo获取receiverDispatcher,里面封装了BroadcastReceiver和IIntentReceiver的实现类InnerReceiver,这样在收到广播时,receiverDispatcher就能轻松调用BroadcastReceiver中的onreceive方法。
3、通过AMS进行具体的广播注册,核心是将远程的IIntetnReceiver和IntentFilter对象存储起来。

广播的发送和接受

image.png
image.png

1、通过ContextWrapper 到ComtextImpl调用sendBroadcast方法,向AMS发起一个异步请求用于发送广播,即broadcastIntent(),会给广播的intent添加排除/添加死亡的进程的flag,表示是否要对处于停止状态的应用起作用。
2、在broadcastIntentLocked内部,根据intent-filter查找出匹配的广播并经过一系列的条件过滤。最终满足条件的接受者会被添加到BroadcastQueue中,然后BroadcastQueue就会发送广播给响应的广播接收者。
3、系统遍历mParallelBroadcasts并将其中的广播发送给所有的接收者,具体的发送过程通过app.thread的跨进程调用方式实现,在ApplicationThread中调用IntentReceiver的performReceive方法。
4、通过LoadedApk.ReceiverDispatcher来处理performReceive方法,,利用H.post跳转到主线程中运行,最终调用的是该IntentReceiver对应Receiver的onReceive方法。

相关文章

网友评论

      本文标题:BroadcastReceiver的启动过程

      本文链接:https://www.haomeiwen.com/subject/acaguctx.html