對應不同的廣播,傳送方法如下:
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 ...
怎樣做需求分析(之二)
撥開需求分析的迷霧 像這樣的對話經常出現在軟體開發的過程中。客戶 專案經理的需求對分析人員來講,像 霧裡看 花 般模糊並令開發者感到困惑。那麼,我們就撥開霧影,分析一下需求的具體內容 業務需求 反映了組織機構或客戶對系統 產品高層次的目標要求,通常在專案定義與範圍文件中予以說明。使用者需求 描述了使...