【源码】BroadcastReceiver动态广播注册

动态广播注册源码笔记

ContextWrapper

1、registerReceiver

    @Override
    public Intent registerReceiver(
        BroadcastReceiver receiver, IntentFilter filter) {
   
        return mBase.registerReceiver(receiver, filter);
    }

ContextImpl

1、registerReceiver

    public Intent registerReceiver(BroadcastReceiver receiver, 
                IntentFilter filter,String broadcastPermission, 
                Handler scheduler, int flags) {
   

        return registerReceiverInternal(receiver, getUserId(),
                filter, broadcastPermission, scheduler, getOuterContext(), flags);
    }

2、registerReceiverInternal(重要)

这里有一个很重要的类:LoadedApk.ReceiverDispatcher,它是LoadedApk的一个内部类,它持有三个重要的变量:

  • 1、BroadcastReceiver:我们调用registerReceiver时候传进来的BroadcastReceiver
  • 2、getOuterContext:如果我们在Activity调用registerReceiver,那这个context就是来自于ActivityContextImpl;同时这也是为什么我们在onReceive的时候其中一个参数是Context
  • 3、Handler:在分发的时候广播接收器并不是直接从AMS那里拿到发送给它的广播的,而是通过Handler机制去分发(所以没有绝对的并行广播)

同时ReceiverDispatcher还有一个内部类InnerReceiver,这是一个继承自IIntentReceiver.Stub同时实现了IInterface的类,代表这是一个本地Binder对象,它还持有一个弱引用对象WeakReference<LoadedApk.ReceiverDispatcher>
也就是说:调用ActivityManager.getService().registerReceiver方法传入的参数InnerReceiver里面包含了receiver、context、handler,然后AMS将其保存在内部List,这也就是为什么在分发广播的时候能找得到对应的接收器。

(关于Stub,它和Proxy一样都是继承了IBinder同时实现了IInterface的类,严格来讲Proxy是通过组合持有IBinder。说明StubProxy具有IPC能力,而这两者由asInterface方法根据要通信的进程在本进程还是其他进程来决定调用哪一个)

        private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId,
            IntentFilter filter, String broadcastPermission,
            Handler scheduler, Context context, int flags) {
   
        //这个类很重要,属于ReceiverDispatcher的内部类
        //是一个用于通信的IBinder对象
        //内部持有一个ReceiverDispatcher的弱引用对象
        IIntentReceiver rd = null;
        if (receiver != null) {
   
            if (mPackageInfo != null && context != null) {
   
                if (scheduler == null) {
   
                    scheduler = mMainThread.getHandler();
           
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值