在運行時啓用和禁用廣播接收者

譯自:http://www.grokkingandroid.com/enabling-and-disabling-broadcastreceivers/




在運行時啓用和禁用廣播接收者


BroadcastReceivers能讓我們很好的知道一些系統當前發生的事件。但是有的時候我們只需要得知某個事件發生過就行了,或者在短期內期望知道某個事件是否發生

動態註冊廣播接收者機制並不能很好的解決這個問題,因爲當事件發生時你的宿主Activity和註冊的廣播接收者可能已經不可用了。唯一能達到要求的只有在代碼中去啓用和禁用廣播接收者了

禁用或者啓用廣播接收者


你可以使用PackageManager類中的方法來禁用或啓用廣播接收者。PackageManager 能夠在運行時啓用和禁用一些應用組件(activity、receiver、service、provider),下面是具體的使用方法
PackageManager pm = getPackageManager();
ComponentName compName =
      new ComponentName(getApplicationContext(),
            YourReceiver.class);
pm.setComponentEnabledSetting(
      compName,
      PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
      PackageManager.DONT_KILL_APP);


Supported states of setComponentEnabledSetting()
COMPONENT_ENABLED_STATE_DEFAULT 設置爲manifest中配置狀態
COMPONENT_ENABLED_STATE_DISABLED 設置爲禁用
COMPONENT_ENABLED_STATE_ENABLED 設置爲啓用

setComponentEnabledSetting()方法支持如下三種狀態


在一個組件狀態的改變不可預知的情況,默認模式下PackageManager會殺死你的應用程序。使用DONT_KILL_AP模式可以避免你的應用被殺死,並且BroadcastReceivers的使用也是安全可靠的。當然如果你不使用DONT_KILL_APP模式,即使在絕大多數匆忙測試的情況下你也會發現錯誤~

默認禁用廣播接收者

如果你想在程序運行時啓用receiver,你可以在manifest文件中進行配置,初始化時就禁用廣播接收者
<receiver
   android:name=".YourReceiver"
   android:enabled="false">
   <!-- your intent filter -->
</receiver>


什麼時候你該在運行時啓用和禁用廣播接收者


你應該這樣做的最基本原因是你想爲你的手機設備節省重要的資源(比如電源)。你肯定不想因爲與一些用戶不相關的代碼而消耗掉電池,這是完全沒有必要的。可能大多數情況下,你可以使用一個動態註冊的廣播接收者來達到效果,但是不是在所有的情況下都會奏效。

下面幾種情況就可以明確的使用PackageManager方案

1、你可能需要知道下一次手機重啓,但只需知道下一次。在這種情況下,你就不能使用動態註冊receiver方法了。你必須靜態註冊一個廣播接收者。但是你又不想監聽每次手機的啓動。在這種情況下,你就可以在監聽到下一次手機啓動後使用PackageManager來禁用該接收者了

2、當一個或多個廣播接收者的存在依賴於一個特殊的系統服務,只要依賴的服務的狀態不是所期望的,你就可以禁用所有廣播接收者了。

3、你打算使用通知-但是隻有當應用當前不活躍時。這種情況下,你的廣播接收者默認下是啓用的,但在Activity的onResume()方法中禁用,在onPause()方法中重新啓用

針對這一主題你還可以去看看 Reto Meier’s blog post about location-based apps ,或者更深入一步查看源碼accompanying source code.他在his talk at Google’s IO 2011上介紹了這一主題,非常值得一看的video !

相關文章:




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章