动态注册广播流程学习
动态注册广播流程
1.在 Activity 中动态注册广播时,调用 registerReceiver 方法,会调用到 ContextWrapper 的 registerReceiver 方法:
2.这个方法内部,mBase 其实就是一个 ContextImpl 类型的对象,所以会执行 ContextImpl 类的 registerReceiver 方法
经过 registerReceiver 重载最终会调用到 registerReceiverInternal 这个方法中,在这个方法中会先将 scheduler 先赋值为主线程的 handler(上面传的 scheduler 为 null,这个 Hanlder 是后面用来分发 ActivityManagerService 发送过的广播用的);接下来创建一个 IIntentReceiver 类型的对象:如果 mPackageinfo 不为空调用 mPackageInfo.getReceiverDispatcher 创建,为空调用 LoadedApk.ReceiverDispatcher 创建(mPackageInfo 是 LoadedApk 类型的对象),其实 IIntentReceiver 就是 LoadedApk.ReceiverDispatcher.InnerReceiver 类型的对象,由于 InnerReceiver 是继承 IIntentReceiver.Stub,所以这个 InnerReceiver 类型的对象其实就是一个 Binder,它后面作为 app 进程和 system_server 进程进行通信的桥梁(AMS 在收到相应的广播时,就是通过这个 Binder 对象来通知 MainActivity 来接收的。)。mPackageInfo 是 LoadedApk 类型的对象,接着先分析 LoadedApk 类的 getReceiverDispatcher 方法的具体实现:
通过 LoadedApk 的 getReceiverDispatcher 方法,可以看出,它里面调用了 LoadedApk.ReceiverDispatcher 的构造方法,从上面贴出的代码可以看到,这个构造方法里面创建了一个 InnerReceiver 的对象,并将这个对象赋值给 mIIntentReceiver 这个变量,后面通过 getIIntentReceiver 方法获取的就是这个 InnerReceiver 类型的对象。小结:1.==在新建广播接收发布器 ReceiverDispatcher 时,会在构造函数里面创建一个 InnerReceiver 实例,这是一个 Binder 对象,实现了 IIntentReceiver 接口,可以通过 ReceiverDispatcher.getIIntentReceiver 函数来获得,获得后就会把它传给 ActivityManagerService,以便接收广播。==2.==在 ReceiverDispatcher 类的构造函数中,还会把传进来的 Handle 类型的参数 activityThread 保存下来,以便后面在分发广播的时候使用。==










评论