广播注册有静态注册和动态注册两种。 静态注册是指在AndroidMenifest.xml文件中进行注册。 静态注册是指在安装APP应用程序时,系统通过PMS完成整个注册。 动态注册是指通过代码实现注册过程。
动态注册广播的代码最终调用了contextImpl的方法。 代码路径如下所示: frameworks/base/core/Java/Android/app/context impl.Java
然后到AMS的路径: frameworks/base/services/core/Java/com/Android/server/am/activitymanagerservice.Java
AMS的registerReceiver方法主要存储我们传递的IIntentReceiver对象。 代码如下所示。
至此,广播动态注册过程完成。
接下来,我们来看看发送广播的过程。 发送广播的过程的代码在ContextImpl中实现
还是返回contextImpl,代码如下所示。
AMS的broadcastIntent中有以下代码行:
调用了broadcastIntentLocked方法。 在broadcastIntentLocked中,如下所示:
然后来到BroadcastQueue的scheduleBroadcastsLocked代码路径如下:
frameworks/base/services/core/Java/com/Android/server/am/broadcast queue.Java
虽然这种方法主要发送了消息,但接下来我们来看看对该消息的处理:
在消息处理中,主要调用了此方法。 接下来,我们来看看这个方法:
delivertoregisteredreceiverlocked方法使用以下代码完成发送行为:
接下来,我们来看看performReceiveLocked这种方法的具体实现。
您可以看到您调用了ApplicationThread的scheduleRegisteredReceiver。 代码如下所示。
可以看到在这段代码中调用了IIntentReceiver的performReceive方法。 正如我之前提到的,IIntentReceiver是为了在进程之间通信从本地Receive转换的Binder。 在上面的performReceiver中调用的加载apk的ReceiverDispatcher的performReceive方法代码如下:
此方法在mActivityThread的post方法中执行Args。
所以他用h的post把这个args发送到主线程运行,接下来看看args的例子。 代码如下所示。
可以看到Args实现了Runnable接口,他的run方法调用BroadReceiver的onReceive方法