原理
- 訂閱者在AMS注冊
- 發(fā)布者發(fā)送廣播到AMS
- 廣播的流轉由AMS控制
class MyBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
Log.i("ljf", "onReceive")
}
}
廣播被接收后,回調onReceive
靜態(tài)注冊
在manifest聲明receiver
<receiver android:name=".MyBroadcastReceiver"/>
四大組件聲明必備,動態(tài)注冊到此是一致的。
靜態(tài)注冊必須聲明intent-filter,用于指明所接收的廣播国觉。
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="ljf" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
Category為四大組件分類,多組件同action時可根據(jù)intent中的category確定組件
常見:
CATEGORY_DEFAULT:Android系統(tǒng)中默認的執(zhí)行方式,按照普通Activity的執(zhí)行方式執(zhí)行皮获。
CATEGORY_HOME:設置該組件為Home Activity朝氓。
CATEGORY_PREFERENCE:設置該組件為Preference魔市。
CATEGORY_LAUNCHER:設置該組件為在當前應用程序啟動器中優(yōu)先級最高的Activity赵哲,通常為入口ACTION_MAIN配合使用待德。
CATEGORY_BROWSABLE:設置該組件可以使用瀏覽器啟動枫夺〗埽
CATEGORY_GADGET:設置該組件可以內嵌到另外的Activity中。
通過靜態(tài)注冊的receiver,在首次啟動時注冊到AMS较坛,并常駐系統(tǒng)中印蔗。
由于Android系統(tǒng)的限制,靜態(tài)注冊無法獲得系統(tǒng)廣播(大大部分)丑勤,見下系統(tǒng)廣播
動態(tài)注冊
通過代碼進行注冊华嘹、注銷操作
val intentFilter=IntentFilter()
intentFilter.addAction("ljf")
intentFilter.addCategory("android.intent.category.DEFAULT")
registerReceiver(receiver, filter)
unregisterReceiver(receiver)
動態(tài)注冊并不會常駐,而是與綁定者生命周期一致法竞。注冊耙厚、注銷要成對出現(xiàn),否則當綁定者結束會報異常
普通廣播
發(fā)布者發(fā)送廣播岔霸,各個接收者接收廣播是獨自進行的并不會互相影響薛躬。
val intent = Intent("ljf")
intent.action="ljf"
intent.addCategory("android.intent.category.DEFAULT")
sendBroadcast(intent)
有序廣播
發(fā)布者發(fā)送廣播,廣播按接收者的優(yōu)先級呆细,由高優(yōu)先級向低優(yōu)先級傳遞
<intent-filter android:priority="1000"> //-1000 至 1000
高優(yōu)先級的接收者向下傳遞廣播也可中止廣播的傳遞型宝,在向低優(yōu)先級的receiver傳遞時也可以添加中途處理的數(shù)據(jù)
abortBroadcast()
setResultExtras(Bundle())
getResultExtras(boolean) //這里的Boolean為null處理
發(fā)送有序廣播需要指明permission,只有符合的receiver才可接收絮爷,permission為null表示不要求receiver
sendOrderedBroadcast(intent, "permission")
接收者需聲明自定義permission
<permission android:protectionLevel="normal" //permission等級
android:name="permission" />
并使用此權限
<uses-permission android:name="permission" />
系統(tǒng)廣播
由系統(tǒng)發(fā)出的廣播趴酣,但隨著Android系統(tǒng)升級Google對權限和性能的管理逐步細化
從Android 3.1開始,系統(tǒng)給Intent定義了兩個新的Flag坑夯,分別為FLAG_INCLUDE_STOPPED_PACKAGES(表示包含未啟動的App)和FLAG_EXCLUDE_STOPPED_PACKAGES(表示不包含未啟動的App)价卤,用來控制Intent是否要對處于停止狀態(tài)的APP起作用
系統(tǒng)廣播基本都FLAG_EXCLUDE_STOPPED_PACKAGES,所以當APP被stop后渊涝,即使靜態(tài)注冊的receiver也不會收到廣播
當自己開發(fā)多進程間的功能時慎璧,如果發(fā)廣播給另外的APP切記加FLAG_INCLUDE_STOPPED_PACKAGES
接收系統(tǒng)廣播時還是用動態(tài)注冊比較保險,以防Google和國內rom