动态广播注册源码分析

来源:互联网 发布:java 线程面试题 编辑:程序博客网 时间:2024/04/30 10:31

说明:代码基于Android 23源码
本博客使用到的源码文件所在的位置(按出现顺序):


   从源码的角度分析,动态广播的注册过程。作为广播的注册就是广播接受者接受什么样的广播的信息注册到ActivityManagerService中,让ActivityManagerService将该信息保存起来,这样当收到匹配的广播就会发送给该广播接收器。

动态广播的注册时通过使用

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

该方法是在activity里必须实现的,动态广播注册方法。借用罗大神的有关activity继承关系的图:
这里写图片描述
registerReceiver的真正执行是在ContextImpl.java里面:

@Override    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {        return registerReceiver(receiver, filter, null, null);    }    @Override    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,            String broadcastPermission, Handler scheduler) {//broadcastPermission、scheduler为null        return registerReceiverInternal(receiver, getUserId(),                filter, broadcastPermission, scheduler, getOuterContext());//getOuterContext()获取注册该广播的activity的上下文    }    private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId,            IntentFilter filter, String broadcastPermission,            Handler scheduler, Context context) {        IIntentReceiver rd = null;        if (receiver != null) {            if (mPackageInfo != null && context != null) {                if (scheduler == null) {                    scheduler = mMainThread.getHandler();                }                rd = mPackageInfo.getReceiverDispatcher(                    receiver, context, scheduler,                    mMainThread.getInstrumentation(), true);            } else {                if (scheduler == null) {                    scheduler = mMainThread.getHandler();                }                rd = new LoadedApk.ReceiverDispatcher(                        receiver, context, scheduler, null, true).getIIntentReceiver();            }        }        try {            final Intent intent = ActivityManagerNative.getDefault().registerReceiver(                    mMainThread.getApplicationThread(), mBasePackageName,                    rd, filter, broadcastPermission, userId);            if (intent != null) {                intent.setExtrasClassLoader(getClassLoader());                intent.prepareToEnterProcess();            }            return intent;        } catch (RemoteException e) {            throw e.rethrowFromSystemServer();        }    }

最终进入到registerReceiverInternal方法中进行执行

原创粉丝点击