在运行时启用和禁用广播接收者

译自: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 !

相关文章:

  • Android Tutorial: BroadcastReceiver
  • Android: Getting Notified of Connectivity Changes




你可能感兴趣的:(android)