broadcast receiver是什么意思
BroadcastReceiver詳解(基礎(chǔ)篇)
Broadcast (廣播)是一種廣泛運用的應(yīng)用程序之間傳輸信息的機制,而 BroadcastReceiver (廣播接收器)則是用于接收來自系統(tǒng)和應(yīng)用的廣播對并對其進行響應(yīng)的組件,Android中我們要發(fā)送的廣播內(nèi)容是一個 Intent ,這個 Intent 中可以攜帶我們要傳送的數(shù)據(jù)
創(chuàng)建一個廣播接收器非常簡單,只需要繼承 BroadcastReceiver ,并重寫 onReceive() 即可
BroadcastReceiver 也是四大組件之一,所以我們也需要對 BroadcastReceiver 進行注冊,不同于其他四大組件, BroadcastReceiver 有兩種注冊方式,分別是 靜態(tài)注冊 和 動態(tài)注冊
靜態(tài)注冊
當(dāng)我們的應(yīng)用首次啟動的時候,系統(tǒng)會自動實例化我們靜態(tài)注冊的 BroadcastReceiver ,然后將這個 BroadcastReceiver 注冊到系統(tǒng)中,系統(tǒng)接收到廣播之后,就會做出相應(yīng)的判斷,調(diào)用 onReceive() 方法。通過這種方式注冊的廣播,即使我們的應(yīng)用被銷毀,依然能收到廣播。 這里要注意的是,我們的應(yīng)用一定要被啟動過 ,如果沒有被啟動可能就無法接收到廣播,可以參考文章 Android應(yīng)用在未啟動的情況下無法收到指定廣播的問題總結(jié)
正是因為靜態(tài)注冊耗電、占內(nèi)存、不受程序生命周期影響,所以Google在Android 8.0上禁止大部分廣播的靜態(tài)注冊,可以參考官文文檔 Android 8.0 功能和 API
動態(tài)注冊
通過動態(tài)注冊的廣播, BroadcastReceiver 的生命周期跟隨Activity的生命周期
注意: 要在 Activity 的 onPau() 中 unRegeisterReceiver() ,否則會引起內(nèi)存泄漏。比較推薦 onResume() 中去注冊廣播,在 onPau() 中去注銷廣播。因為在內(nèi)存資源比較吃緊的情況下,可能我們的 Activity 執(zhí)行完 onPau() 之后就被銷毀,這時候 Activity 的 onStop() 和 onDestory() 方法就不會執(zhí)行了
BroadcastReceiver注冊完之后,這個 BroadcastReceiver 就能夠接收響應(yīng)的廣播,下面我們來說說如何發(fā)送一條廣播
普通廣播(Normal Broadcast)
普通廣播完全是異步的,通過 context.ndBroadcast() 方法發(fā)送,消息傳遞效率比較高,但所有接收器的執(zhí)行順序不確定。缺點是接收者不能將處理結(jié)果傳遞給下一個接收者,并且無法終止廣播的傳播
有序廣播(Ordered Broadcast)
有序廣播是通過 context.ndOrderedBroadcast() 方法發(fā)送,所有的廣播者按照優(yōu)先級依次執(zhí)行,廣播接收器的優(yōu)先級通過 receiver 的 intent-filter 中的 android:priority 屬性來設(shè)置,數(shù)值越大優(yōu)先級越高。當(dāng)廣播接收器接收到廣播后,可以使用 tResult() 方法把結(jié)果傳遞給下一個接收者,通過 getResult() 方法獲取上一個接收者傳遞過來的結(jié)果,并可以通過 abortBroadcast() 方法丟棄該廣播,使該廣播不再傳遞給下一個接收者
粘性廣播(Sticky Broadcast)
粘性廣播通過 context.ndStickBroadcast() 方法來發(fā)送,用此方法發(fā)送的廣播會一直滯留,當(dāng)有匹配此廣播的接收器被注冊后,該廣播接收器就會收到此廣播。使用此廣播時,需要獲得 BROADCAST_STICKY 權(quán)限
由于在Android5.0 & API 21中已經(jīng)失效,所以不建議使用。
本地廣播(Local Broadcast)
前三種廣播都是全局廣播,所有應(yīng)用都可以接收到,這樣就帶來安全隱患,而本地廣播只在進程內(nèi)傳播,可以起到保護數(shù)據(jù)安全的作用
其實,本地廣播的使用與其十分類似,之前的步驟均是一樣的,調(diào)用者不同而已,本地廣播調(diào)用的是 LocalBroadcastManager 相關(guān)方法,全局廣播調(diào)用的是 Context 的相關(guān)方法,其方法名都是一樣的
這里需要說一下, 使用本地廣播并沒有靜態(tài)注冊的方法 ,因為靜態(tài)注冊主要是為了讓程序在未啟動的情況下也能收到廣播,而發(fā)動本地廣播的時候,我們的程序已經(jīng)是啟動了,所以,自然是沒有靜態(tài)注冊這個方法
Android中內(nèi)置了多個系統(tǒng)廣播,當(dāng)使用系統(tǒng)廣播時,只需要在注冊廣播接收者時定義相關(guān)的 action 即可,并不需要手動發(fā)送廣播,當(dāng)系統(tǒng)有相關(guān)操作(如開機、網(wǎng)絡(luò)狀態(tài)變化、拍照等等)時會自動進行系統(tǒng)廣播
Android系統(tǒng)廣播 action 如下:
本文介紹了 BroadcastReceiver 的兩種注冊方式(動態(tài)注冊、靜態(tài)注冊),四種發(fā)送方式(普通廣播、有序廣播、粘性廣播(API21廢棄)、本地廣播),以及系統(tǒng)廣播的用法。幾乎涵蓋了 BoradcastReceiver 在應(yīng)用開發(fā)過程中的所有知識,對于BroadcastReceiver原理感興趣的可以繼續(xù)看 BroadcastReceiver詳解(原理篇)
Android BroadcastReceiver詳解
Android2.1 BroadCastReceiver接收不到數(shù)據(jù),什么原因
如何注冊broadcastreceiver
本文發(fā)布于:2023-02-28 20:28:00,感謝您對本站的認可!
本文鏈接:http://m.newhan.cn/zhishi/a/167767732083970.html
版權(quán)聲明:本站內(nèi)容均來自互聯(lián)網(wǎng),僅供演示用,請勿用于商業(yè)和其他非法用途。如果侵犯了您的權(quán)益請與我們聯(lián)系,我們將在24小時內(nèi)刪除。
本文word下載地址:broadcastreceiver(關(guān)于broadcastreceiver).doc
本文 PDF 下載地址:broadcastreceiver(關(guān)于broadcastreceiver).pdf
| 留言與評論(共有 0 條評論) |