启用和禁用广播接收器
我尝试使用此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
没有正确设置(例如,你的领导)。 试试我正在使用的构造函数,它将Context
和Class
作为参数。
我认为使用PackageManager是过度思考你的情况。 您有一个BroadcastReceiver需要有时忽略它正在监听的广播。 我可以想到两个简单的方法来解决这个问题:
1)设置一个标志,您的接收机可以检查忽略或接受广播,不必担心启用/禁用它。
2)以编程方式创buildBroadcastReceiver(甚至可以是内部类),并根据需要在给定的应用程序部分注册和取消注册。
一般来说,我发现用代码而不是XML来定义我的BroadcastReceivers已经提供了更多的灵活性,并且通常对我来说更容易pipe理。