Android Broadcast 分析 ( 1 )

关于广播的分发

关于Android的广播分发会分两个篇章来介绍,先把结论放到最前。

1.对于广播注册来说,分为静态注册和动态注册,
   分别会用 ResolveInfo 和 BroadcastFilter 来实例化,

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

3.广播分发,是先发普通广播,Parallel Broadcast,一次发给所有 Receiver
   然后在发有序广播 Serialized Broadcast 的时候,先发给动态注册的Receiver,再发给静态注册的 Receiver。
   而静态注册的 Receiver 通过 H 去分发消息。

这部分主要简单分析注册过程,

之前的了解结果,广播的处理可以在主线程和子线程,
主线程的情况,
会在 ActivityThread 的 H.handleMessage 处理从 ApplicationThread 分发过来的广播消息,
handleReceiver 会从消息中取出对应的 Receiver 去回调 onReceive 操作

子线程的情况,
需要在注册广播的时候传递一个子线程 handler 和 receiver进去,
然而胡巴@wx_huhuxjh126 研究过之后发现实际上 handler 不写任何 handleMessage 操作也可以,
ApplicationThread 在分发时会直接运行一个封装了 receiver 的 runnable 对象,
也就是说不需要通过 handleMessage 来回调 receiver.onReceive,

> 前提

分析广播的分发有个前提,需要了解广播注册的时候到底是注册什么到什么,

嗯哼先给出结论,
注册,是把一个实现了 Binder 类 IIntentReceiver 的 InnerReceiver 对象 注册到 ActivityManagerServer,

InnerReceiver --持有--> ReceiverDispatch --持有--> BroadcastReceiver 和 Handler

> 注册

不管是主线程的handler还是子线程的handler,
注册都是把一个实现了 IIntentReceiver 的 InnerReceiver 对象交给 AMS 去注册,

Paste_Image.png

这段关于 InnerReceiver 的代码可以看出来,
InnerReceiver 是一个 IBinder ,
最终 AMS 也是使用这个东西来分发消息的。

ReceiverDispatcher,看名字可以猜这个东西既是用来接收也用来分发广播

下面顺便理一下 Activity 和针对各个不同广播的 Receiver 是怎样一种对应关系

Paste_Image.png

在 LoadedApk 中,
有个对象 mReceiver,
ArrayMap<Context, ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher>>
这货是用 context 作为 key, 来对应上面代码里这个 map,
ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher>
而这个 map 是以 receiver 为 key,来对应各个不同的 ReceiverDispatcher 的,
也就是说只要给定一个 activity 和 BroadcastReceiver,就可以找到是否有对应的 ReceiverDispatcher 存在

> 注册 Binder

Paste_Image.png

这里涉及的是 AIDL 的 Binder 注册过程,比较简单就省略分析了。

以上,
不涉及动态注册的广播和静态注册的广播的区别,
这两者会在分发的时候有不同的逻辑处理。
这里只提一下两者的 receiver 的不同,
静态注册的广播 Receiver 继承于 ResolverInfo
动态注册的广播 Receiver 继承于 BroadcastFilter

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容