BroadcastReceiver工作过程

《BroadcastReceiver工作过程》 有点略长,先抚慰一下

注册过程(分析动态注册)

广播注册分为静态注册和动态注册。

静态注册的广播在应用安装时由系统自动完成注册,即由PMS(PackageManagerService)来完成整个注册过程的,其他三大组件也是在应用安装时由PMS解析并注册的。

《BroadcastReceiver工作过程》 BroadcastReceiver动态注册过程

1. ContextWrapper的registerReceiver方法

<code>ContextWrapper</code>并没有做实际的工作,将注册过程交给<code>ContextImpl</code>

2. ContextImpl registerReceiver

3. ContextImpl的registerReceiverInternal方法

  • 系统从<code>mPagkageInfo</code>获取<code>IIntentReceiver</code>对象
  • 采用跨进程方式向AMS发送广播注册的请求

PS:采用<code>IIntentReceiver</code>是因为注册的过程是一个进程间通信的过程,而BroadcastReceiver是一个android组件,不能直接跨进程传递,需要通过<code>IIntentReceiver</code>中转一下。
<code>IIntentReceiver</code>是一个Binder接口,具体实现是LoadedApk.ReceiverDispatcher.InnerReceiver,ReceiverDispatcher内部保存了BroadcastReceiver和InnerReceiver,接收到广播时,ReceiverDispatcher可以方便调用BroadcastReceiver的onReceiver方法。

4. AMS的<code>registerReceiver</code>方法

把远程的<code>InnerReceiver</code>对象以及<code>IntentFilter</code>对象存储起来,整个广播注册过程完成。

发送接收广播过程(分析普通广播)

通过send发送广播,AMS查找匹配的广播接收者并将广播发送给它们处理。广播发送类型:普通广播、有序广播和粘性广播。

《BroadcastReceiver工作过程》 发送接收广播过程

1) ContextWrapper的 <code>sendBroadcast </code>方法

PS:Context的<code>sendBroadcast</code>方法是一个抽象方法

2) ContextImpl的 <code>sendBroadcast </code>方法

向AMS发起一个异步请求用于发送广播

3) AMS的 <code>broadcastIntent </code>方法

4) AMS的 <code>broadcastIntentLocked </code>方法

broadcastIntentLocked内部根据intent-filter查找匹配的广播接收者并经过一系列条件过滤,最终将满足条件的广播接收者添加到BroadcastQueue中,接着BroadcastQueue将广播发送给相应的广播接收者。

系统在android3.1中为Intent添加了两个标记位,用来判断广播是否要对于处于停止状态的应用起作用。

  • FLAG_INCLUDE_STOPPED_PACKAGES(两种标记位共存时,以他为准)
    表示包含已经停止的应用,这个时候广播会发送给已经停止的应用。
  • FLAG_EXCLUDE_STOPPED_PACKAGES
    表示不包含已经停止的应用,这个时候广播不会发送给已经停止的应用。

Android3.1开始,系统为所有广播默认添加<code>FLAG_EXCLUDE_STOPPED_PACKAGES</code>,为了防止广播无意间或者在不必要的时候调起已经停止运行的应用。

一个应用处于停止状态

  • 安装后未运行
  • 应用被手动或者其他应用强停。

5) BroadcastQueue的 <code>scheduleBroadcastsLocked </code>方法

并没有立即发送广播,发送了一个<code>BROADCAST_INTENT_MSG</code>类型的信息,<code>BroadcastQueue</code>收到消息调用<code>processNextBroadcast</code>方法

6) BroadcastQueue的 <code>processNextBroadcast </code>方法

无序广播存储在<code>mParallelBroadcasts</code>中,系统遍历mParallelBroadcasts并将其中的广播发送给它们所有的接收者,通过<code>deliverToRegisteredReceiverLocked</code>方法。

7) <code>deliverToRegisteredReceiverLocked </code>方法

将一个广播发送给一个特定的接收者,内部调用<code>performReceiveLocked</code>方法来完成具体的发送过程。

8) <code>performReceiveLocked</code>方法

9) ApplicationThread的 <code>scheduleRegisteredReceiver </code>方法

10) InnerReceiver的 <code>performReceiver </code>方法

11) <code>LoadedApk.ReceiverDispatcher </code>的 <code>performReceive </code>方法

创建一个 <code>Args </code>对象并通过<code>mActivityThread</code>的post方法执行Args中的逻辑,Args实现了 <code>Runnable </code>接口。
<code>mActivityThread</code>是一个Handler,其实就是<code>ActivityThread</code>中的mH,mH的类型就是<code>ActivityThread</code>的内部类H。

至此BroadcastReceiver的<code>onReceive</code>方法被执行,应用已经收到广播,同时onReceive方法在广播接收器的主线程中被调用。

《BroadcastReceiver工作过程》 THAT’S ALL

    原文作者:weixin_34319817
    原文地址: https://blog.csdn.net/weixin_34319817/article/details/87225749#t1
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞