1、在Android的广播机制中,ActivityManagerService扮演着广播中心的角色,负责系统中所有广播的注册和发布操作,因此,Android应用程序注册广播接收器的过程就把是广播接收器注册到ActivityManagerService的过程。Android应用程序是通过调用ContextWrapper类的registerReceiver函数来把广播接收器BroadcastReceiver注册到ActivityManagerService中去的,而ContextWrapper类本身又借助ContextImpl类来注册广播接收器。

注册流程

先看我一般是这样注册的:

注册

2、先调用ContextWrapper 的registerReceiver------>ContextImpl 的 registerReceiver

3、registerReceiver--->registerReceiverInternal中:

第一步:mPackageInfo.getReceiverDispatcher函数获得一个IIntentReceiver接口对象rd,这是一个Binder对象。

在LoadedApk.getReceiverDispatcher 中:

在新建广播接收发布器ReceiverDispatcher时,会在构造函数里面创建一个InnerReceiver实例,这是一个Binder对象,实现了IIntentReceiver接口,可以通过ReceiverDispatcher.getIIntentReceiver函数来获得,获得后就会把它传给ActivityManagerService,以便接收广播。在ReceiverDispatcher类的构造函数中,还会把传进来的Handle类型的参数activityThread保存下来,以便后面在分发广播的时候使用。

第二步:这个函数通过Binder驱动程序就进入到ActivityManagerService中的registerReceiver函数中去了


在ActivityManagerService中,用一个进程记录块来表示这个应用程序进程,它里面有一个列表receivers,专门用来保存这个进程注册的广播接收器。接着,又把这个ReceiverList列表以receiver为Key值保存在ActivityManagerService的成员变量mRegisteredReceivers中,这些都是为了方便在收到广播时,快速找到对应的广播接收器的。

上面只是把广播接收器receiver保存起来了,但是还没有把它和filter关联起来,这里就创建一个BroadcastFilter来把广播接收器列表rl和filter关联起来,然后保存在ActivityManagerService中的成员变量mReceiverResolver中去。

        这样,广播接收器注册的过程就介绍完了,比较简单,但是工作又比较琐碎,主要就是将广播接收器receiver及其要接收的广播类型filter保存在ActivityManagerService中,以便以后能够接收到相应的广播并进行处理

更多相关文章

  1. 安卓手机助手Jihosoft Android(安卓)Manager英文安装及注册教程(
  2. android 4.x receiver、services无法启动
  3. Android零碎知识
  4. Android调试笔记——FATAL EXCEPTION: main...have you declared
  5. 作业三——观察者模式在Android广播机制上的应用
  6. Android(安卓)的权限级别小记
  7. Android(安卓)ContentProvider的使用和理解
  8. Android开发面试经——2.常见Android基础笔试题
  9. Android监听手机网络变化

随机推荐

  1. GPS 研究一 (Android2.3)
  2. LeakCanary源码分析
  3. Android IMF 学习笔记三
  4. Android(安卓)camera ISP相关 术语解释(
  5. Android中如何让手机屏幕不待机(PowerMana
  6. eclipse 在线安装android包:Download inte
  7. ActionBarSherlock的学习笔记(一) --------
  8. Android从零开始(26)(设置全屏+横屏、相
  9. android 修改默认Launcher
  10. Android的属性系统