通过对应的Context对象的registerReceiver方法,通过LoadedApk的registerReceiverInternal方法注册,首先获取到BroadcastReceiver的IIntentReceiver对象,再通过AMS进行注册。获取IIntentReceiver是通过getReceiverDispatcher方法。
LoadedApk里面有个mReceiver的Map,通过它维护每个context所对应的BroadcastReceiver和IIntentReceiver键值对的Map。
创建好后,就放到Map中,ReceiverDispatcher初始化的时候会创建上面需要的IIntentReceiver对象,它里面实现的这个InnerReceiver extends IIntentReceiver.Stub,是个实现的服务端。最终返回的也是这个。
这个时候到LoadedApk的registerReceiverInternal通过AMS注册的时候,会把这个IIntentReceiver对象传过去。
AMS的registerReceiver方法,Ams存储动态注册的IIntentReceiver对象,先构建一个ReceiverList对象,里面包含了IIntentReciever的所在的appprocess等信息,然后Ams有一个mRegisteredReceivers的HashMap来存储对应的ReceiverList,这个HashMap键是IIntentReceiver的binder值,值是ReceiverList。同时会存储一份到对应的AppProcess中。
看下ReceiverList的定义:ReceiverList extends ArrayList
这样客户端构建的IintentReciever的binder对象,就存储到Ams中了。
AMS中存储的结构如下: