启用和禁用广播接收器

我尝试使用此PackageManager方法启用和禁用广播接收器:

setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 

广播接收机在清单中注册。 接收器工作正常,但当我尝试禁用它,它仍然收到广播消息。 当我通过“android:enabled =”false“”禁用清单中的接收器时,接收器不会收到任何东西,但我无法启用它。

我从服务内部调用该方法。

  PackageManager pm = getApplicationContext().getPackageManager(); ComponentName componentName = new ComponentName("com.app", ".broadcast_receivers.OnNetworkChangedReceiver"); pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 

Android清单:

  <receiver android:name=".broadcast_receivers.OnNetworkChangedReceiver" android:enabled="true"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> </intent-filter> </receiver> 

收件人

 public class OnNetworkChangedReceiver extends BroadcastReceiver { private static final String TAG = "OnNetworkChangedReceiver"; @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "in OnNetworkChanged"); } } 

我也从昨天的活动里面调用了这个方法。 我认为它的工作,但今天没有工作了。 难道是有时候意图(android.net.conn.CONNECTIVITY_CHANGE),我昨天误解为禁用接收器有很大的延迟?

PackageManager的方法是正确的还是在这个概念中有一个基本的错误?

谢谢,斯文

那么,你基本上有什么好的。 我在我的一个项目中有以下代码:

 boolean enabled=prefs.getBoolean(key, false); int flag=(enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED); ComponentName component=new ComponentName(EditPreferences.this, OnBootReceiver.class); getPackageManager() .setComponentEnabledSetting(component, flag, PackageManager.DONT_KILL_APP); 

当我没有任何需要安排的活动警报时,我使用它来禁用BOOT_COMPLETED接收器。

我的猜测是你的ComponentName没有正确设置(例如,你的领导)。 试试我正在使用的构造函数,它将ContextClass作为参数。

我认为使用PackageManager是过度思考你的情况。 您有一个BroadcastReceiver需要有时忽略它正在监听的广播。 我可以想到两个简单的方法来解决这个问题:

1)设置一个标志,您的接收机可以检查忽略或接受广播,不必担心启用/禁用它。

2)以编程方式创buildBroadcastReceiver(甚至可以是内部类),并根据需要在给定的应用程序部分注册和取消注册。

一般来说,我发现用代码而不是XML来定义我的BroadcastReceivers已经提供了更多的灵活性,并且通常对我来说更容易pipe理。