第2部分會(huì)分析分發(fā)過(guò)程
> 廣播分發(fā)的流程圖
這張圖描述了整個(gè)廣播分發(fā)的流程坏晦,
為了簡(jiǎn)化,
這一節(jié)只從 AMS 的 processNextBroadcast 開始分析
備注:這個(gè)方法在6.0的時(shí)候移到了 BroadQueue 類中掉冶, AMS 的代碼也有相應(yīng)的調(diào)整
> 有序廣播和普通廣播
首先在廣播里有兩種形式准夷,
分別保存在 BroadcastQueue 類的兩個(gè)對(duì)象里
在廣播分發(fā)邏輯中双抽,
首先會(huì)處理并行廣播,也就是普通廣播琳要,
同時(shí)把廣播分發(fā)到所有能接收這個(gè)廣播的 Receiver 去寡具,
有序廣播就是一個(gè)個(gè)來(lái)了
> processNextBroadcast( ) -- Parallel Broadcast
普通廣播在 processNextBroadcast 一開始就進(jìn)行分發(fā),
比較簡(jiǎn)單稚补,
每次從 mParallelBroadcasts<> 中取出并同時(shí)刪除最前面的 BroadcastRecord 對(duì)象童叠,
這個(gè)類保存了包括廣播消息內(nèi)容、時(shí)間课幕、處理Receiver等信息
在循環(huán)中不斷取出 BroadcastRecord 對(duì)象厦坛,
用 deliverToRegisteredReceiverLocked 進(jìn)行分發(fā),
到了這里就很容易理解了乍惊,
app.thread.scheduleRegisteredReceiver 杜秸,這里是跨進(jìn)程調(diào)用,
后面就是到 ActivityThread 中去調(diào)不同的 receiver.performReceive了污桦。
之后的事情概括地解釋就是 post 一個(gè)帶有 receiver 的 runnable 對(duì)象,去做 onReive 操作匙监。
> processNextBroadcast( ) -- Serialized Broadcast
有序廣播的分發(fā)包括了靜態(tài)和動(dòng)態(tài)注冊(cè)的分發(fā)凡橱,
這里就分了兩個(gè)邏輯,
在分發(fā)完 Parallel 廣播后亭姥,還有一大段的廣播超時(shí)機(jī)制稼钩,
這里略過(guò),直接看 Serialized 廣播的分發(fā)达罗,
前面說(shuō)過(guò) BroadcastFilter 類型的實(shí)例是動(dòng)態(tài)注冊(cè)的 Receiver坝撑,
靜態(tài)類型廣播分發(fā)到這里是先把 動(dòng)態(tài)注冊(cè) 的發(fā)出去,然后又看到熟悉的 deliverToRegisteredReceiverLocked() 了粮揉,
這個(gè)方法接下去的部分照舊巡李,忽略不寫。
然后扶认,
到這里就是有序廣播的靜態(tài)注冊(cè) Receiver 分發(fā)了侨拦,
在這段代碼之前有一部分判斷對(duì)應(yīng)的 Receiver 有沒有對(duì)應(yīng)的 Process 存在,
如果沒有要先把這個(gè) Process 調(diào)起來(lái)辐宾,
最后會(huì)走 processCurBroadcastLocked()狱从,
而這個(gè)方法也是通過(guò)跨進(jìn)程調(diào)用去執(zhí)行靜態(tài)注冊(cè)的 Receiver 的 onReceive 方法,
上面代碼中的 app, thread, 跨進(jìn)程調(diào)用叠纹,
scheduleReceiver() 在 ActivityThread 中的邏輯是 sendMessage 到 H 中季研,
然后 handleMessag 會(huì)去調(diào) Receiver 的 onReceive 方法。
總結(jié)誉察,
對(duì)于廣播注冊(cè)來(lái)說(shuō)与涡,分為靜態(tài)注冊(cè)和動(dòng)態(tài)注冊(cè),
分別會(huì)用 ResolveInfo 和 BroadcastFilter 來(lái)實(shí)例化,
對(duì)于廣播類型递沪,也分有序廣播和普通廣播豺鼻。
廣播分發(fā),是先發(fā)普通廣播款慨,Parallel Broadcast儒飒,一次發(fā)給所有 Receiver
然后在發(fā)有序廣播 Serialized Broadcast 的時(shí)候,先發(fā)給動(dòng)態(tài)注冊(cè)的Receiver檩奠,再發(fā)給靜態(tài)注冊(cè)的 Receiver桩了。
而靜態(tài)注冊(cè)的 Receiver 通過(guò) H 去分發(fā)消息。