资讯专栏INFORMATION COLUMN

BroadcastReceiver学习笔记

roundstones / 2155人阅读

摘要:注册过程注册的过程大致如下图所示调用的方法,然后传入实例和实例。调用的方法,由类将所在进程的等包装成类。并将其内部类返回,传给进行注册。中的是与沟通的桥梁。

BroadcastReceiver 注册过程

BroadcastReceiver 注册的过程大致如下图所示:

           +----------------+      +-------------+       +-------------------------+    +------------------------+
           | ContextWrapper |      | ContextImpl |       | LoadedApk(mPackageInfo) |    | ActivityManagerService |
           +-----+----------+      +------+------+       +------------+------------+    +---------------+--------+
                 |                        |                           |                                 |         
                 |                        |                           |                                 |         
 registerReceiver|                        |                           |                                 |         
                 |                        |                           |                                 |         
 +--------------->                        |                           |                                 |         
                 |        registerReceiver|                           |                                 |         
                 |                        |                           |                                 |         
                 +------------------------>                           |                                 |         
                 |                        |    getReceiverDispatcher  |                                 |         
                 |                        |                           |                                 |         
                 |                        +--------------------------->                                 |         
                 |                        |                           |                                 |         
                 |                        |      [IIntentReceiver]    |                                 |         
                 |                        |                           |                                 |         
                 |                        <---------------------------+                registerReceiver |         
                 |                        |                           |                                 |         
                 |                        +------------------------------------------------------------->         
                 |                        |                           |                                 |         
                 |                        |                           |                                 |         
                 v                        v                           v                                 v         

调用ContextWrapper的registerReceiver方法,然后传入receiver实例和filter实例。

调用ContextImpl的registerReceiverInternal方法, 由LoadedApk类将context、receiver、scheduler(receiver所在进程的handler)等包装成ReceiverDispatcher类。并将其内部类IIntentReceiver返回,传给ActivityManagerService进行注册。

LoadeApk中与BroadcastReceiver注册相关的类结构图如下所示:

                                                                                                              
  +-------------------------------------------------------------+                                                 
  |  LoadedApk                                                  |                                                 
  |                                                             |                                                 
  |     +-------------------+                                   |                                                 
  |     | mReceivers        |        +-----------------------+  |                                                 
  |     +-------------------+        | receiver1->dispatcher |  |                                                 
  |     |  context(Activity)+-------->                       |  |                                                 
  |     |                   |        | receiver2->dispatcher |  |                                                 
  |     |  context          |        |                       |  |                                                 
  |     |                   |        | receiver3->dispatcher |  |                                                 
  |     |  context          |        |                       |  |                                                 
  |     |                   |        |    ...                |  |                                                 
  |     |   ...             |        +-----------------------+  |                                                 
  |     +-------------------+                                   |                                                 
  |                                                             |                                                 
  |                                                             |                                                 
  +-------------------------------------------------------------+                                                 
                                                                                                              

LoadedApk中保存着context与其注册的各个receiver的对应关系,同时也保存着每个receiver与其dispatcher的对应关系。
dispatcher中的IIntentReceiver是与ActivityManagerService沟通的桥梁。其内部结构如下图所示:

+--------------------------------------------------+                                                      
| ReceiverDispatcher                               |                                                      
|   +-------------------------------------------+  |                                                      
|   | InnerReceiver extends IIntentReceiver.Stub|  |                                                      
|   +-------------------------------------------+  |                                                      
|                                                  |                                                      
|   BroadcastReceiver mReceiver;                   |                                                      
|   Context mContext;                              |                                                      
|   Handler mActivityThread;                       |                                                      
|                                                  |                                                      
+--------------------------------------------------+                                                      

ActivityManagerService在其registerReceiver方法中,将传入的IIntentReceiver和filter以及caller保存成如下所示的结构:

+---------------------------------------------------------------------------+                                     
|                                                                           |                                     
|  ActivityManagerService                                                   |                                     
|                                                   +---------------------+ |                                     
|                                                   | ReceiverList        | |                                     
|                                  +-------------+  +---------------------+ |                                     
|                               +-->InnerReceiver+-->    BroadcastFilter1 | |                                     
|      +---------------------+  |  +-------------+  |                     | |                                     
|      | mRegisteredReceivers+--+                   |    BroadcastFilter2 | |                                     
|      +---------------------+  |                   |                     | |                                     
|                               |  +-------------+  |        ...          | |                                     
|                               +-->InnerReceiver|  +---------------------+ |                                     
|                               |  +-------------+                          |                                     
|                               |                                           |                                     
|                               |                                           |                                     
|                               +-->    ...                                 |                                     
|                                                                           |                                     
|                                                                           |                                     
|                             +------------------+                          |                                     
|     +-------------------+   | BroadcastFilter1 |                          |                                     
|     | mReceiverResolver +--->                  |                          |                                     
|     +-------------------+   | BroadcastFilter2 |                          |                                     
|                             |                  |                          |                                     
|                             |     ...          |                          |                                     
|                             +------------------+                          |                                     
|                                                                           |                                     
+---------------------------------------------------------------------------+                                     

保存成这种结构的原因是为后面发送Broadcast提供高效的实现。

Broadcast 发送过程

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/12374.html

相关文章

  • 安卓开发笔记(九):广播动态注册实现监听网络变化

    摘要:一中的广播主要分两种类型标准广播和有序广播。有序广播的工作流程如下有序广播工作示意图二注册广播的方式有两种,在代码中注册动态注册和在中注册静态注册。接下来先通过动态注册的方式编写一个能够监听网络变化的程序,学习一下广播接收器的基本用法。一. Android 中的广播主要分两种类型:标准广播和有序广播。 标准广播(Normal broadcasts)   是一种完全异步执行的广播,在广播发...

    Leo_chen 评论0 收藏0
  • 如何自学Android

    摘要:如何自学知识储备本知识点不做重点讲解对于有基础的同学推荐看编程思想,巩固基础,查漏补全,了解并熟悉更多细节知识点。基础学习基础学习对于这些基础的使用谷歌官网给出了很好的实例。是谷歌根据自带的改进的。是基于谷歌内核的一个可以作为浏览器的视图。 如何自学Android 1. Java知识储备 本知识点不做重点讲解: 对于有基础的同学推荐看《Java编程思想》,巩固基础,查漏补全,了解...

    alexnevsky 评论0 收藏0
  • 如何自学Android

    摘要:如何自学知识储备本知识点不做重点讲解对于有基础的同学推荐看编程思想,巩固基础,查漏补全,了解并熟悉更多细节知识点。基础学习基础学习对于这些基础的使用谷歌官网给出了很好的实例。是谷歌根据自带的改进的。是基于谷歌内核的一个可以作为浏览器的视图。 如何自学Android 1. Java知识储备 本知识点不做重点讲解: 对于有基础的同学推荐看《Java编程思想》,巩固基础,查漏补全,了解...

    paraller 评论0 收藏0
  • 安卓开发笔记(十一):SharedPrefences储存

    摘要:一利用将数据储存于当中这里主要是创建一个对象,这样才可以调用其中的方法,后面的东西照抄就可以了这里主要是根据传递到文件里的数据的类型来运用不同的函数进行编写这行代码的意思是通过就能够把二将数据从当中读取并进行更新前面的参数表示的是前面使用的一.利用SharedPrefences将数据储存于data.txt当中   package com.example.lenovo.studyittwo;...

    LiveVideoStack 评论0 收藏0
  • JPush消息推送的简单使用

    摘要:在本篇文章里我们以极光推送为例,简单的介绍下消息推送的简单使用。 在本篇文章里我们以极光推送JPush为例,简单的介绍下消息推送的简单使用。这里只是简单介绍下步骤及简单使用,作为本人的笔记,详细介绍可以参见极光官网文档:http://docs.jiguang.cn/jpush/... 1.申请开发者帐号 在官网注册帐号,并进入后控制台 showImg(https://segmentfa...

    lushan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<