动态广播注册源码分析
来源:互联网 发布: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方法中进行执行
阅读全文
0 0
- 动态广播注册源码分析
- Android广播之注册广播(包括静态广播和动态广播的注册)源码分析
- Android源码解析之动态注册广播接收器的过程分析
- android 动态注册广播
- android动态注册广播
- 广播接收器动态注册
- 动态注册广播接收器
- 动态注册广播接收者
- Android动态注册广播
- 动态注册监听广播
- 动态注册广播
- 动态注册广播
- 动态注册的广播
- Android 广播接收器注册与注销源码分析
- 基于N源码的广播注册和发送流程分析
- BroadcastReceiver源码分析系列(一):注册广播
- 广播注册过程分析
- Android-动态注册广播和注销广播
- HDOJ HDU 1048 The Hardest Problem Ever
- <meta http-equiv="pragma" content="no-cache">属性http-equiv功能介绍
- eclipse下的UML妙用
- java String
- TCP和UDP的详细区别
- 动态广播注册源码分析
- RPG 游戏数值系统—1
- SQL函数
- Python的标准库sys、copy、os相关用法
- 53. Maximum Subarray
- 比赛7 总结
- Odoo10会计处理
- python:6:集合
- 五、MongoDB的基本数据类型