Android 四大組件之 Broadcast Receiver

  1. Android 中廣播的類(lèi)型
  • 標(biāo)準(zhǔn)廣播
    一種完全異步的廣播,在廣播發(fā)出之后,所有的廣播接收器幾乎都會(huì)在同一時(shí)刻接收到這條廣播,因此它們之間沒(méi)有任何先后順序可言。
  • 有序廣播
    一種同步執(zhí)行的廣播,在廣播發(fā)出后,同一時(shí)刻只會(huì)有一個(gè)廣播接收器能夠接收到這條廣播消息,當(dāng)這個(gè)廣播接收器的邏輯執(zhí)行完畢后,廣播才會(huì)繼續(xù)傳遞。所以此時(shí)的廣播接收器是有先后順序的,優(yōu)先級(jí)高的廣播接收器就可以先收到廣播信息,并且前面的廣播接收器還可以截?cái)嗾趥鬟f的廣播,這樣后面的廣播接收器就無(wú)法收到廣播信息了。

在使用 AS 創(chuàng)建廣播時(shí),Exported 屬性表示是否允許這個(gè)廣播接收器接收本程序以外的廣播, Enabled 屬性表示是否啟用這個(gè)廣播接收器

  1. 廣播接收器的創(chuàng)建及動(dòng)態(tài)注冊(cè)
  • 新建一個(gè)類(lèi),繼承 BroadcastReceiver,并重寫(xiě)父類(lèi)的 onReceive 方法。這樣當(dāng)廣播到來(lái)的時(shí)候就會(huì)得到執(zhí)行,具體的邏輯就可以在這個(gè)方法中處理。
  • 通過(guò) IntentFilter 來(lái)添加想要監(jiān)聽(tīng)的廣播,并調(diào)用 registerReceiver 來(lái)動(dòng)態(tài)注冊(cè)廣播。動(dòng)態(tài)注冊(cè)的廣播接收器一定都要取消注冊(cè)才行,即 unregisterReceiver() 方法。
  1. 靜態(tài)注冊(cè)
    動(dòng)態(tài)注冊(cè)的廣播接收器必須要在程序啟動(dòng)之后才能接收到廣播,如果要讓程序在未啟動(dòng)的情況下就能接收到廣播,就需要用到靜態(tài)注冊(cè)的方式。 靜態(tài)的廣播接收器一定要在 AndroidManifest.xml 文件中注冊(cè)才可以使用。如果使用 AS 的快捷方式創(chuàng)建的廣播接收器,注冊(cè)這一步會(huì)被自動(dòng)完成。還需要在AndoidManifest.xml 文件中聲明權(quán)限和監(jiān)聽(tīng)的廣播類(lèi)型。

  2. 不要在 onReceive 方法里添加過(guò)多的邏輯或進(jìn)行任何耗時(shí)的操作,因?yàn)樵趶V播接收器中是不允許開(kāi)啟線程的,當(dāng) onReceive 方法運(yùn)行了較長(zhǎng)時(shí)間而沒(méi)有結(jié)束時(shí),程序就會(huì)報(bào)錯(cuò)。因此,廣播接收器更多的是扮演一種打開(kāi)程序其他組件的角色,比如創(chuàng)建一條狀態(tài)欄通知,或者啟動(dòng)一個(gè)服務(wù)等。

  3. 使用自定義廣播

  • 有序廣播
Intent intent = new Intent("com.example.broadcasttest.MyBroadcast");
sendBroadcast(intent);
  • 無(wú)序廣播
    廣播是一種跨進(jìn)程的通信方式,因此在應(yīng)用程序內(nèi)發(fā)出的廣播,其他應(yīng)用程序也是可以收到的。
Intent intent = new Intent("com.example.broadcasttest.MyBroadcast");
sendOrderedBroadcast(intent, null);
  1. 截?cái)鄰V播
abortBroadcast();
  1. 本地廣播
    前面發(fā)送和接收的廣播全部屬于系統(tǒng)全局廣播,容易引起安全性問(wèn)題。
    本地廣播機(jī)制能夠使發(fā)出的廣播只能夠在應(yīng)用程序內(nèi)部進(jìn)行傳遞,并且廣播接器也只能接收來(lái)自本應(yīng)用程序發(fā)出的廣播。
    該機(jī)制使用 LocalBroadcastManager 來(lái)對(duì)廣播進(jìn)行管理,并提供了發(fā)送廣播和注冊(cè)廣播接收器的方法。
    本地廣播是無(wú)法通過(guò)靜態(tài)注冊(cè)的方式來(lái)接收的,也不需要。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容