广播的注册分为静态注册和动态注册,其中静态注册的广播在应用安装时由系统自动完成注册,具体来说是由 PMS(PackageManagerService)来完成整个注册过程的,除了广播以外,其他三大组件也都是在应用安装时由 PMS 解析并注册的。
在 ContextImpl.registerReceiverINternal() 中,首先从 mPackageInfo 中获取 IIntentReceiver 对象,然后采用 IPC 的方式向 AMS 发送广播注册的请求。
IIntentReceiver 是一个 Binder 接口。
在 AMS.registerReceiver() 中,会把远程的 InnerReceiver 对象以及 IntentFilter 对象存储起来。
HashMap<IBinder, ReceiverList> mRegisteredReceivers
在 AMS.broadcastIntentLocked() 中,会根据 intent-filter 查找出匹配的广播接收者并经过一系列的条件过滤,最终会将满足条件的广播接收者添加到 BroadcastQueue 中,接着 BroadcastQueue 就会将广播发送给相应的广播接收者。
ContentProvider 是一种内容共享型组件,它通过 Binder 向其他组件乃至其他应用提供数据。当 ContentProvider 所在的进程启动时,ContentProvider 会同时启动并被发布到 AMS 中。需要注意的是,这个时候 ContentProvider 的 onCreate() 要先于 Application 的 onCreate() 而执行。
当一个应用启动时,入口方法是 ActviityThread.main(),main() 方法是一个静态方法,在 main() 方法中会创建 ActivityThread 的实例并创建主线程的消息队列,然后在 ApplicationThread.attach() 中远程调用 AMS.attachApplication() 并将 ApplicaiotnThread 对象提供给 AMS。ApplicationThread 是一个 Binder 对象,它的 Binder 接口是 IApplicaitonThread,它主要用于 ActivityThread 和 AMS 之间的通信。
在 AMS.attachApplication() 中,会调用 ApplicationThread.bindApplication(),这个过程同样是跨进程完成的,bindApplication() 的逻辑会经过 ActivtyThread.H 切换到 ActivityThread 中执行,具体方法是 handleBindApplication()。在 handleBindApplicaiton() 中,ActivityThread 会创建 Application 对象并加载 ContentProvider。需要注意的是,ActivityThread 会先加载 ContentProvider,然后再调用 Application.onCreate() 方法。