Android – 如何注销清单中创build的接收器?
我知道在Java代码中使用registerReceiver和unregisterReceiver来处理接收者,但是假设我在我的清单中有以下内容:
<receiver android:name=".headsetHook"> <intent-filter android:priority="99999999999"> <action android:name="android.intent.action.ACTION_HEADSET_PLUG" /> </intent-filter> </receiver>
有没有办法我可以在Java代码注销这个地方? 我可以给它一个id属性或东西,然后得到它,并取消注册? 我问,因为我希望我的应用程序只在第一次执行此操作时执行某些操作,然后取消注册并稍后以Java重新注册。
希望我明确表示,谢谢你的帮助。
您可以使用PackageManager
来启用/禁用在Manifest中声明的BroadcastReceiver
。 Broadcast Receiver
只有在启用时才会被触发。
使用此来创build一个组件
ComponentName component = new ComponentName(context, MyReceiver.class);
检查组件是启用还是禁用
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"); }
启用/禁用组件(广播接收器在你的情况)
//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的回答,我创造了这个实用的方法
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); } }