@@@描述 廣播接收器可以收到 Context.sendBroadcast或者Context.sendOrderedBroadcast發出的意圖(intent)。 @@@LocalBroadcastManager 如果你不需要誇應用發送廣播,建議你使用 LocalBroadcastManager,
@@@描述 廣播接收器可以收到
Context.sendBroadcast
或者Context.sendOrderedBroadcast發出的意圖(intent)。
@@@LocalBroadcastManager
如果你不需要誇應用發送廣播,建議你使用 LocalBroadcastManager, LocalBroadcastManager 是一個幫助類,幫助你方便的在
當前應用
中註冊廣播接收 器和發送廣播。並且和發送全局廣播比起來,他還有如下優勢:
1,不用擔心私有數據的安全性,因為發送的廣播不會讓除當前應用之外的其他應用接收到。
2,不用擔心其他應用會利用你的安全漏洞,因為其他應用不可能通過 LocalBroadcastManager向你發送廣播。
3,它比發送全局廣播更加高效。
LocalBroadcastManager的常用方法如下:
@@@註冊
廣播接收器可以通過Context.registerReceiver()來動態註冊,還可以通過在 AndroidManifest.xml
中添加<receiver>
標簽靜態註冊。
動態註冊方式:如果你在 Activity.onResume()註冊一個廣播接收器,你應該在
Activity.onPause()註銷這個它
. (當Activity Pause的時候,你不會接受到廣播,如果你不在 Activity.onPause()中註銷,將會帶來極大的資源消耗。
). 不要在Activity.onSaveInstanceState()中註銷一個廣播接收器
, 因為該方法不會在用戶移動到歷史堆棧中其他Activity的時候被調用。
靜態註冊方式:
其中:priority來設置優先順序,類型為Integer類型,範圍為-1000~1000,在這個範圍中,值越大,優先順序越高。
例子:
自定義三個廣播接收器。
1,
2,
3,
4,在清單文件中註冊,並分別制定他們的優先順序為1000,500,1;
5,通過Context.sendBroadcast發送廣播。
結果為:
@@@廣播的類型:
1,普通廣播(Normal broadcasts ):普通廣播是由Context.sendBroadcast方法發送的。這種方式是完全非同步的,在這種方式下,所有的廣播接收器都運行在一個無序的狀態下,經常是所有接收器同時接受到廣播,這種方式也更加高效,但是不能中斷。
2,有序廣播(Ordered broadcasts):有序廣播是由Context.sendOrderedBroadcast方法發送的,這種方式一次只能由一個接收器接收,所有的接收器輪流收到廣播,所以他可以傳播一個結果到下一個接收器,或者完全中斷一個廣播。接受的順序是由清單文件配置中priority來決定的,範圍為(-1000~1000)值越大,優先順序越高,相同優先順序的接收器以任意的順序收到廣播。
@@@有關安全性的思考。
考慮到廣播接收器是誇應用的特性,所以我們應該考慮到我們的自己的接收器不被其他應用濫用。
1,Intent的命名空間是全局的,所以Intent的action name和其他String參數要考慮唯一性,否則我們可能無意中和其他應用衝突。
2,動態註冊廣播接收器時,可以用許可權來限制誰可以發送廣播給我們。
3,靜態註冊時,任何滿足你指定的intent-filters的廣播都可以向你發送廣播,我們可以使用指定android:exported="false"的屬性來阻止其他廣播發送給你。
@@@廣播接收器的生命周期註意
1,一個廣播接收器對象只是在其 onReceive(Context, Intent)方法被調用的時候才有效,一旦 onReceive(Context, Intent)方法的代碼唄返回,廣播接收器的對象將不再有效。這個主要的影響就是你能在 onReceive(Context, Intent)方法中執行什麼操作,任何有關非同步的操作是無用的,因為當非同步操作執行完成後, onReceive(Context, Intent)方法已經執行完,廣播接收器對象已不再有效或者被系統回收。
2,通常情況下,你不能在 onReceive(Context, Intent)方法中彈出一個對話框,或者綁定一個service,對於前者,你可以用NotificationManager
來代替,對於後者,你可以調用Context.startService()
方法來代替。對於耗時操作應該在Service中執行。