Broadcast 分析 之二

2021-08-07 05:58:13 字數 3268 閱讀 6855

對應不同的廣播,傳送方法如下:

public void sendbroadcast(intent intent, string receiverpermission)

public void sendorderedbroadcast(intent intent, string receiverpermission)

public void sendstickybroadcast(intent intent)

contextimpl的sendbroadcast呼叫流程圖如下,

sendbroadcast方法如下,

public void sendbroadcast(intent intent)  catch (remoteexception e) 

}

當應用apk發起乙個廣播時,最後都會通過跨程序呼叫到ams的broadcastintent方法,只是有些標誌(是否是順序廣播)不一樣而已。

broadcastintent方法如下,

intent intent, string resolvedtype, iintentreceiver resultto,

int resultcode, string resultdata, bundle resultextras,

boolean serialized, boolean sticky, int userid)

} broadcastintentlocked方法又臭又長,其他的就不多說了,看主要的,

private final int broadcastintentlocked()

registeredreceivers = null;

nr = 0;

}if ((receivers != null && receivers.size() > 0)|| resultto != null) }}

由於廣播分為動態廣播和靜態廣播,所以在該函式中,分別定義了2個list來查詢並儲存匹配的靜態和動態廣播,最後分別插入廣播佇列進行處理。

collectreceivercomponents方法如下,

private listcollectreceivercomponents(intent intent, string resolvedtype,

int callinguid, int users)

.queryintentreceivers(intent, resolvedtype, stock_pm_flags, user);

if (user != userhandle.user_owner && newreceivers != null)

if (!singleuserreceivers.contains(cn))

} else }}

}} catch (remoteexception ex)

return receivers;

}

public listqueryintentreceivers(intent intent, string resolvedtype, int 

flags, int userid)

}if (comp != null)

return list;

}// reader

synchronized (mpackages)

final packageparser.package pkg = mpackages.get(pkgname);

if (pkg != null)

return null;}}

一般廣播都是動態廣播,而有序廣播兩種狀態都有,有序廣播儲存receivers 序列中。首先查詢符合條件的靜態廣播

receivers =collectreceivercomponents(intent,

然後將receivers 和registeredreceivers根據資料的大小(優先順序)合併到receivers中,最後插入佇列並發起實際的廣播排程。

queue.enqueueorderedbroadcastlocked(r);

queue.schedulebroadcastslocked();

結構圖如下:

查詢到符合條件的動態廣播之後,根據broadcastfilter建立乙個broadcastrecord節點,插入broadcastqueue內的並行處理佇列,

最後發起實際的廣播排程。

結構圖如下:

一般廣播裡面的所有廣播同時全部執行,最後呼叫onreceive函式,通過finishreceiver反饋結果。在processnextbroadcast函式中,

可以看到同時呼叫,

最後都會呼叫processcurbroadcastlocked執行,呼叫onreceive處理廣播。

因為是有序廣播,是乙個乙個安裝順序執行,在反饋的結果broadcastreceive中,會根據相關資訊呼叫processnextbroadcast函式接著

執行下乙個廣播。

廣播完成之後和ams還有乙個互動,其實有序廣播就比一般廣播多了乙個重複的過程,相當於多條廣播逐條執行。

broadcast之二的使用

在上面一講的時候,我簡單介紹了,broadcast的在乙個應用的常規使用。在寫完這個東西簡介以後,筆者想起來曾經做的乙個專案裡面,使用了sendbroadcast通知更新資料的乙個案例。intent intentdatalimit newintent intent.xx intentdatalimi...

分析函式之二

2.rank dense rank 的使用原表資訊 sql break on deptno skip 1 為效果更明顯,把不同部門的資料隔段顯示。sql select deptno,ename,sal 2from emp 3order by deptno,sal desc deptno ename ...

怎樣做需求分析(之二)

撥開需求分析的迷霧 像這樣的對話經常出現在軟體開發的過程中。客戶 專案經理的需求對分析人員來講,像 霧裡看 花 般模糊並令開發者感到困惑。那麼,我們就撥開霧影,分析一下需求的具體內容 業務需求 反映了組織機構或客戶對系統 產品高層次的目標要求,通常在專案定義與範圍文件中予以說明。使用者需求 描述了使...