Android 四大組件之 Broadcast Receiver

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

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

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

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

  3. 使用自定義廣播

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

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

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