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