android广播框架分析:动态注册过程

 

动态注册:

         通过对应的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,它是一个List,里面存储的序列结构是BroadcastFilter。BroadcastFilter 的定义BroadcastFilter extends IntentFilter,当上面的ReceiverList构建完成后,会将传进来的IntentFilter构建成BroadcastFilter,然后add到ReceiverList中去。

     这样客户端构建的IintentReciever的binder对象,就存储到Ams中了。

    AMS中存储的结构如下:

android广播框架分析:动态注册过程_第1张图片

 

 

 

 

你可能感兴趣的:(frameworks,android)