Android - how to unregister a receiver created in the manifest?
我知道在Java代码中使用registerReceiver和unregisterReceiver来处理接收器,但可以说我的清单中包含以下内容:
1 2 3 4 5 | <receiver android:name=".headsetHook"> <intent-filter android:priority="99999999999"> </intent-filter> </receiver> |
有什么办法可以在Java代码中的某个地方取消注册吗? 我可以给它一个id属性或其他东西,然后获取它并注销它吗? 我之所以这样问,是因为我希望我的应用仅在第一次执行此操作时才执行某项操作,然后取消注册并稍后在Java中重新注册。
希望我能说清楚,谢谢您的帮助。
您可以使用
使用它来创建一个组件
1 | ComponentName component = new ComponentName(context, MyReceiver.class); |
检查组件是启用还是禁用
1 2 3 4 5 6 | int status = context.getPackageManager().getComponentEnabledSetting(component); if(status == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { Log.d("receiver is enabled"); } else if(status == PackageManager.COMPONENT_ENABLED_STATE_DISABLED) { Log.d("receiver is disabled"); } |
启用/禁用组件(您的情况下为广播接收器)
1 2 3 4 | //Disable context.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED , PackageManager.DONT_KILL_APP); //Enable context.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_ENABLED , PackageManager.DONT_KILL_APP); |
根据Varun的回答,我创建了这种功利主义方法
1 2 3 4 5 6 7 8 9 | private void unregisterReceiverFromManifest(Class<? extends BroadcastReceiver> clazz, final Context context) { final ComponentName component = new ComponentName(context, clazz); final int status = context.getPackageManager().getComponentEnabledSetting(component); if(status == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { context.getPackageManager() .setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); } } |