前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android广播发送流程深度分析

Android广播发送流程深度分析

作者头像
PhoenixZheng
发布2018-08-27 16:51:28
1.1K0
发布2018-08-27 16:51:28
举报
文章被收录于专栏:Phoenix的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 去分发消息。

==== 今日沙雕 ===

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android每日一讲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档