- Android 中廣播的類型
- 標(biāo)準(zhǔn)廣播
一種完全異步的廣播,在廣播發(fā)出之后,所有的廣播接收器幾乎都會在同一時刻接收到這條廣播,因此它們之間沒有任何先后順序可言。 - 有序廣播
一種同步執(zhí)行的廣播,在廣播發(fā)出后,同一時刻只會有一個廣播接收器能夠接收到這條廣播消息,當(dāng)這個廣播接收器的邏輯執(zhí)行完畢后,廣播才會繼續(xù)傳遞。所以此時的廣播接收器是有先后順序的,優(yōu)先級高的廣播接收器就可以先收到廣播信息,并且前面的廣播接收器還可以截斷正在傳遞的廣播,這樣后面的廣播接收器就無法收到廣播信息了。
在使用 AS 創(chuàng)建廣播時,Exported 屬性表示是否允許這個廣播接收器接收本程序以外的廣播, Enabled 屬性表示是否啟用這個廣播接收器
- 廣播接收器的創(chuàng)建及動態(tài)注冊
- 新建一個類,繼承 BroadcastReceiver,并重寫父類的 onReceive 方法。這樣當(dāng)廣播到來的時候就會得到執(zhí)行,具體的邏輯就可以在這個方法中處理。
- 通過 IntentFilter 來添加想要監(jiān)聽的廣播,并調(diào)用 registerReceiver 來動態(tài)注冊廣播。動態(tài)注冊的廣播接收器一定都要取消注冊才行,即 unregisterReceiver() 方法。
靜態(tài)注冊
動態(tài)注冊的廣播接收器必須要在程序啟動之后才能接收到廣播,如果要讓程序在未啟動的情況下就能接收到廣播,就需要用到靜態(tài)注冊的方式。 靜態(tài)的廣播接收器一定要在 AndroidManifest.xml 文件中注冊才可以使用。如果使用 AS 的快捷方式創(chuàng)建的廣播接收器,注冊這一步會被自動完成。還需要在AndoidManifest.xml 文件中聲明權(quán)限和監(jiān)聽的廣播類型。不要在 onReceive 方法里添加過多的邏輯或進行任何耗時的操作,因為在廣播接收器中是不允許開啟線程的,當(dāng) onReceive 方法運行了較長時間而沒有結(jié)束時,程序就會報錯。因此,廣播接收器更多的是扮演一種打開程序其他組件的角色,比如創(chuàng)建一條狀態(tài)欄通知,或者啟動一個服務(wù)等。
使用自定義廣播
- 有序廣播
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);
- 截斷廣播
abortBroadcast();
- 本地廣播
前面發(fā)送和接收的廣播全部屬于系統(tǒng)全局廣播,容易引起安全性問題。
本地廣播機制能夠使發(fā)出的廣播只能夠在應(yīng)用程序內(nèi)部進行傳遞,并且廣播接器也只能接收來自本應(yīng)用程序發(fā)出的廣播。
該機制使用 LocalBroadcastManager 來對廣播進行管理,并提供了發(fā)送廣播和注冊廣播接收器的方法。
本地廣播是無法通過靜態(tài)注冊的方式來接收的,也不需要。