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中声明的BroadcastReceiverBroadcast 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); } }