Android广播发送流程深度分析

今天的内容会比较艰深,

主要分析广播发送流程的内部实现,其中大部分都在于分析Framework代码。

广播分发的流程图

这张图描述了整个广播分发的流程,

为了简化,

这一节只从 AMS 的 processNextBroadcast 开始分析

备注:这个方法在6.0之后移到了 BroadQueue 类中, AMS 的代码也有相应的调整

> 有序广播和普通广播

首先在广播里有两种形式,

分别保存在 BroadcastQueue 类的两个对象里

在广播分发逻辑中,

首先会处理并行广播,也就是普通广播,

同时把广播分发到所有能接收这个广播的 Receiver 去,

有序广播就是一个个来了。

> processNextBroadcast( ) -- Parallel Broadcast

普通广播在 processNextBroadcast 一开始就进行分发,

比较简单,

每次从 mParallelBroadcasts<> 中取出并同时删除最前面的 BroadcastRecord 对象,

这个类保存了包括广播消息内容、时间、处理Receiver等信息

在循环中不断取出 BroadcastRecord 对象,

用 deliverToRegisteredReceiverLocked 进行分发,

到了这里就很容易理解了,

app.thread.scheduleRegisteredReceiver ,这里是跨进程调用,

后面就是到 ActivityThread 中去调不同的 receiver.performReceive了。

之后的事情概括地解释就是 post 一个带有 receiver 的 runnable 对象,去做 onReive 操作。

> processNextBroadcast( ) -- Serialized Broadcast

有序广播的分发包括了静态和动态注册的分发,

这里就分了两个逻辑,

在分发完 Parallel 广播后,还有一大段的广播超时机制,

这里略过,直接看 Serialized 广播的分发,

前面说过 BroadcastFilter 类型的实例是动态注册的 Receiver,

静态类型广播分发到这里是先把 动态注册 的发出去,然后又看到熟悉的 deliverToRegisteredReceiverLocked() 了,

这个方法接下去的部分照旧,忽略不写。

然后,

到这里就是有序广播的静态注册 Receiver 分发了,

在这段代码之前有一部分判断对应的 Receiver 有没有对应的 Process 存在,

如果没有要先把这个 Process 调起来,

最后会走 processCurBroadcastLocked(),

而这个方法也是通过跨进程调用去执行静态注册的 Receiver 的 onReceive 方法,

上面代码中的 app, thread, 跨进程调用,

scheduleReceiver() 在 ActivityThread 中的逻辑是 sendMessage 到 H 中,

然后 handleMessag 会去调 Receiver 的 onReceive 方法。

总结

对于广播注册来说,分为静态注册和动态注册,

分别会用 ResolveInfo 和 BroadcastFilter 来实例化,

对于广播类型,也分有序广播和普通广播。

广播分发,是先发普通广播,Parallel Broadcast,一次发给所有 Receiver

然后在发有序广播 Serialized Broadcast 的时候,先发给动态注册的Receiver,再发给静态注册的 Receiver。

而静态注册的 Receiver 通过 H 去分发消息。

==== 今日沙雕 ===

原文发布于微信公众号 - Android每日一讲(gh_f053f29083b9)

原文发表时间:2018-08-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏玄魂工作室

Hacker基础之Linux篇:基础Linux命令一

这一部分主要是讲解Linux常用命令工具,比如文件管理,文本处理等等,主要是为了让读者用最少的实践掌握和熟练应用基本的Linux操作,对于每个命令的举例,尽量做...

2967
来自专栏猿人谷

进程控制实验--fork()

进程的控制 实验目的 1、掌握进程另外的创建方法 2、熟悉进程的睡眠、同步、撤消等进程控制方法 实验内容 1、用fork( )创建一个进程,再调用exec( )...

3048
来自专栏java一日一条

理解Cookie和Session机制

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确...

1631
来自专栏我和PYTHON有个约会

Django来敲门升级版--[扩展篇]--认证authenticate

Django默认提供了自己的身份认证系统,默认配置下提供有封装好的简单的用户类型以供开发人员直接使用

933
来自专栏IMWeb前端团队

FIS源码-fisrelease概览

本文作者:IMWeb 陈映平 原文出处:IMWeb社区 未经同意,禁止转载 前面已经已fis server open为例,讲解了FIS的整体架构设计,...

2078
来自专栏张善友的专栏

Windows安装和使用zookeeper

之前整理过一篇文章《zookeeper 分布式锁服务》,本文介绍的 Zookeeper 是以 3.4.5 这个稳定版本为基础,最新的版本可以通过官网 http:...

2469
来自专栏java 成神之路

jvm 性能调优工具之 jmap

40012
来自专栏Java3y

Tomcat+Servlet面试题都在这里

下面是我整理下来的Servlet知识点: ? 图上的知识点都可以在我其他的文章内找到相应内容。 Tomcat常见面试题 Tomcat的缺省端口是多少,怎么修改 ...

4113
来自专栏波涛汹涌

在CentOS 7上安装MongoDB

在这个MongoDB教程中,我们将解释如何在CentOS 7上安装数据库,然后提供一些基本特性和功能的简短指南。

1.9K2
来自专栏IT笔记

Linux下用户组、文件权限详解

用户组 在linux中的每个用户必须属于一个组,不能独立于组外。在linux中每个文件有所有者、所在组、其它组的概念 所有者 所在组 其它组 改变用户所在的组 ...

3724

扫码关注云+社区

领取腾讯云代金券