Android:廣播接收器(BroadCastReceiver)要點隨筆。,
@@@描述 廣播接收器可以收到 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中執行。