|
前言 Android App 可以接收來自系統(tǒng)和其他 App 的廣播消息,也可以向它們發(fā)送廣播消息,比較類似于“發(fā)布-訂閱”的設(shè)計(jì)模式,本文主要介紹廣播的類型,如何注冊(cè)廣播,如何發(fā)送廣播以及使用廣播需要注意的一些事兒。 廣播的分類
注冊(cè)廣播 編寫一個(gè)廣播接收者,通常是繼承 BroadcastReceiver 并重寫onReceive(Context,Intent) 方法。
編寫完廣播接收者后,就需要進(jìn)行注冊(cè)(訂閱),告訴系統(tǒng)這個(gè)廣播接收者對(duì)哪些廣播感興趣。注冊(cè)的方式有靜態(tài)注冊(cè)和動(dòng)態(tài)注冊(cè)兩種:
通過動(dòng)態(tài)注冊(cè)的廣播接收者,在宿主(注冊(cè)時(shí)所使用的 Context)的生命周期期間都是有效的。當(dāng)然你也可以在適當(dāng)?shù)臅r(shí)間調(diào)用unregisterReceiver(BroadcastReceiver) 來解除注冊(cè),這個(gè)“適當(dāng)”取決于具體的業(yè)務(wù)需求。例如使用 Activity 的 Context 在onCreate(Bundle) 中注冊(cè)的一個(gè)廣播接收者,可以在 onDestory() 方法回調(diào)時(shí)解除注冊(cè)來防止廣播接收者泄漏。原則:不重復(fù)注冊(cè),不泄露。 以上注冊(cè)的廣播接收者對(duì) android.intent.action.BOOT_COMPLETED 和 jdqm.intent.action.TEST 這兩種action的廣播感興趣,后者是自定義的廣播,前者是開機(jī)完成時(shí)由系統(tǒng)發(fā)出(通常自啟動(dòng)的應(yīng)用會(huì)注冊(cè)這個(gè)廣播),但注冊(cè)這個(gè)廣播須要以下權(quán)限:
發(fā)送廣播
本地廣播只有本應(yīng)用內(nèi)通過LocalBroadcastManager.getInstance(this).registerReceiver 方法注冊(cè)的廣播接收者能收到,具有更高的安全性,效率也更高(不用跨進(jìn)程通信)。
這種類型廣播在 Android6.0 中已經(jīng)被標(biāo)記被過時(shí), 它有不安全(任何 App 都能訪問), 沒有保護(hù) (任何 App 都能修改)等問題。另外發(fā)送這種廣播需要以下權(quán)限
接收順序
然后在其 processNextBroadcast(boolean fromMsg) 方法中,首先是處理了 mParallelBroadcasts 集合。
安全性與實(shí)踐
其他
如果Intent不包含(或都包含)這兩個(gè)flag,則表現(xiàn)形式是包含處于“停止”轉(zhuǎn)態(tài)的應(yīng)用,但是系統(tǒng)默認(rèn)添加了FLAG_EXCLUDE_STOPPED_PACKAGES這個(gè)flag,這一點(diǎn)在源碼中有所體現(xiàn): ActivityManagerService#broadcastIntentLocked
這就意味著如果你想啟動(dòng)處于“停止”狀態(tài)的應(yīng)用,必須添加FLAG_INCLUDE_STOPPED_PACKAGES這個(gè)flag。那么一個(gè)應(yīng)用在什么情況下會(huì)處于停止?fàn)顟B(tài)?①應(yīng)用首次安裝并且沒有啟動(dòng)過;②被人為地強(qiáng)制停止。開機(jī)完成的廣播就是FLAG_EXCLUDE_STOPPED_PACKAGES這種類型的Intent,這意味著如果你的應(yīng)用被停止了,開機(jī)自啟就會(huì)失效。下一篇文章將從源碼的角度來分析廣播的工作流程。 送書 日 更 精 彩 微信號(hào):code-xiaosheng 公眾號(hào) 「code小生」 |
|
|