2018/5/18 17:08:31当前位置推荐好文程序员浏览文章

android提供了广播机制,通过BroadcastReceiver能在不同的进程间传递消息。相似于观察者模式,A应使用通过注册广播表示A对消息subject感兴趣,当B应使用发出subject类型的消息的时候,A应使用就可以收到对应的消息。

android提供静态和动态两种方式进行消息注册,静态注册指的是在AndroidManifest.xml中进行注册,动态注册指的是在Activity通过registerReceiver的方式进行广播注册。

静态广播注册流程

静态广播注册指的是在AndroidManifest.xml注册Receiver,当Apk安装时会将静态注册的Receiver信息注册到PMS中,APK的安装流程(https://www.jianshu.com/p/953475cea991)如下:

APK安装流程

其中installPackageLI完成了Apk的解析,生成了Package对象,scanPackageLi包括四大组件注册之类的操作。

PMS.scanPackageDirtyLI注册静态广播

解析到APK里的静态广播会注册到PMS的mReceivers对象中,mReceivers类型为ActivityIntentResolver。

动态广播注册流程

Activity通过registerReceiver方式进行广播注册,注册流程如下:

registerReceiver流程

ContextImpl.registerReceiverInternal

ContextImpl.registerReceiverInternal

该函数根据BroadcastReceiver对象生成IIntentReceiver对象,该对象和ApplicationThread的功可以一样,试想一下,APP进程向AMS进程注册广播,当AMS收到广播向APP进程分发时需要使用到Binder调使用,IIntentReceiver就是进行跨进程调使用的。

AMS.registerReceiver

AMS将IIntentReceiver保存到mReisterdReceivers中,最终保存到mReceiverResolver.addFilter(bf);中。

sendBroadcast发送广播

sendBroascast流程

发送广播最终走到了AMS.broadcastIntentLocked,其中核心的代码如下所示:

AMS.broadcastIntentLocked

broadcastIntentLocked中receivers表示静态注册的广播,通过collectReceiverComponents从PMS那里获取;registerdReceivers表示动态注册的广播,从mReceiverResolver那里获取。在获取到要接受所有广播后,就调使用如下函数进行广播分发。

广播分发

scheduleBroadcastsLocked开始进行广播发送

BroadcastQueue.scheduleBroadcastsLocked

Handler消息最终调使用了BroadcastQueue.processNextBroadcast,而后调使用了performReceiveLocked,

processNextBroadcast

processNextBroadcast调使用了performReceiverLocked

performReceiverLocked

performReceiverLocked继续调使用IItentReceiver.performReceiver,该调使用的Binder方式,

IItentReceiver.performReceiver

最终调使用了Args.run

Args.run

Args.run通过类加载器加载Receiver对象,并最终调使用onReceive函数,至此,广播发送完成。

网友评论