文章僅做個人筆記使用:
廣播可用作跨應用程序和普通用戶流之外的消息傳遞系統(tǒng)僻爽,廣播消息本身包裝在一個Intent對象中。該意圖還可以包括捆綁在其額外字段中的其他信息绰上。例如产喉,飛行模式意圖包括布爾附加值,指示布爾模式是否打開贝椿。
可以通過兩種方式接收廣播:通過清單聲明的接收者( 靜態(tài)注冊 )和上下文注冊的接收者( 動態(tài)注冊 )想括。
靜態(tài)注冊:在清單中聲明了廣播接收者,則發(fā)送廣播時烙博,系統(tǒng)會啟動應用程序(如果該應用程序尚未運行)瑟蜈。在android8.0以后除了少數(shù)(例如:開機)隱式廣播外,不能使用靜態(tài)注冊的方式聲明隱式廣播接收方式渣窜。
安裝應用程序后铺根,系統(tǒng)軟件包管理器將注冊接收者。接收者將成為應用程序的單獨入口點乔宿,這意味著系統(tǒng)可以啟動該應用程序并在當前未運行該應用程序的情況下傳送廣播位迂。動態(tài)注冊:通過registerReceiver(BroadcastReceiver, IntentFilter)進行注冊,通過unregisterReceiver(BroadcastReceiver)進行注銷予颤。
上下文注冊的接收者只要其注冊上下文有效就可以接收廣播囤官。例如,如果您在Activity上下文中注冊蛤虐,則 只要活動未銷毀党饮,就可以接收廣播。如果您在“應用程序”上下文中注冊驳庭,則只要該應用程序正在運行刑顺,您就會收到廣播。請注意在哪里注冊和注銷接收者以防止泄漏的風險饲常。
Android為應用程序提供了三種 發(fā)送廣播 的方式:
sendOrderedBroadcast(Intent, String)方法一次將廣播發(fā)送到一個接收器蹲堂。當每個接收器輪流執(zhí)行時,它可以將結果傳播到下一個接收器贝淤,或者可以完全中止廣播柒竞,從而不會將其傳遞給其他接收器〔ゴ希可以使用匹配的intent-filter的android:priority屬性控制接收者的運行順序朽基;具有相同優(yōu)先級的接收器將以任意順序運行布隔。
sendBroadcast(Intent)方法以不確定的順序向所有接收方發(fā)送廣播。這稱為正常廣播稼虎。這效率更高衅檀,但是意味著接收器無法讀取其他接收器的結果,傳播從廣播接收的數(shù)據(jù)或中止廣播。
LocalBroadcastManager.sendBroadcast()方法將廣播發(fā)送到與發(fā)送者在同一應用中的接收者。如果不需要跨應用程序發(fā)送廣播媳纬,請使用本地廣播。實施效率更高(無需進程間通信)杉适,您無需擔心與其他應用程序能夠接收或發(fā)送廣播有關的任何安全問題。
如何安全使用廣播:
如果只是需要將廣播發(fā)送到本應用內(nèi)最好使用LocalBroadcastManager.sendBroadcast()柳击,這樣不需要再自己去考慮安全問題淘衙。本地廣播可用作應用程序中的通用發(fā)布/訂閱事件總線,而不會產(chǎn)生系統(tǒng)范圍廣播的任何開銷腻暮。
最好使用動態(tài)注冊,Android本身也更傾向于動態(tài)注冊,很多系統(tǒng)廣播現(xiàn)在只傳遞給動態(tài)注冊的廣播接收器毯侦。例如:CONNECTIVITY_ACTION(網(wǎng)絡狀態(tài)改變)哭靖。
-
如何控制誰可以接收廣播:
- 在發(fā)送廣播時指定全線。
- 在Android 4.0及更高版本侈离,可以指定一個包與 setPackage(String)發(fā)送廣播時试幽。系統(tǒng)將廣播限制為與軟件包匹配的一組應用程序。
-
限制應用接收廣播:
- 注冊廣播時設置權限卦碾。
- 對于聲明清單的接收者铺坞,您可以在清單中將android:exported屬性設置為“ false”。不接收外部應用程序的廣播洲胖。
隨著Android平臺的發(fā)展济榨,它會定期更改系統(tǒng)廣播的行為:
例如:
從Android 9(API級別28)開始, NETWORK_STATE_CHANGED_ACTION(網(wǎng)絡狀態(tài)變更)廣播不會接收有關用戶位置或個人身份數(shù)據(jù)的信息绿映。
從Android 8.0(API級別26)開始擒滑,系統(tǒng)對清單聲明的接收者施加了其他限制。如果您的應用程序針對Android 8.0或更高版本叉弦,則不能使用清單為大多數(shù)隱式廣播(不專門針對您的應用程序的廣播)聲明接收方丐一。當用戶積極使用您的應用程序時,您仍然可以使用上下文注冊的接收器淹冰。
Android 7.0(API級別24)及更高版本不會發(fā)送以下系統(tǒng)廣播:ACTION_NEW_PICTURE和
ACTION_NEW_VIDEO库车。另外,定位到Android 7.0及更高版本的應用必須CONNECTIVITY_ACTION使用來注冊廣播registerReceiver(BroadcastReceiver, IntentFilter)樱拴。在清單中聲明接收者無效柠衍。