Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-如何注销清单中创建的接收者?_Android_Broadcastreceiver - Fatal编程技术网

Android-如何注销清单中创建的接收者?

Android-如何注销清单中创建的接收者?,android,broadcastreceiver,Android,Broadcastreceiver,我知道如何在Java代码中使用registerReceiver和unregisterReceiver来处理接收方,但假设我的清单中有以下内容: <receiver android:name=".headsetHook"> <intent-filter android:priority="99999999999"> <action android:name="android.intent.action.ACTION_HE

我知道如何在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启用/禁用清单中声明的BroadcastReceiver。广播接收器只有在启用时才会被触发

使用此选项创建组件

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");
}
在您的情况下启用/禁用componentBroadcast接收器

//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);

根据瓦伦的回答,我创造了这个实用的方法

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);
        }
    }

哦,该死的,你是老板。让我试试这个,看起来很有希望。只需注意:您可能还会得到状态组件\u启用\u状态\u默认值varun,谢谢您指出这一点,YoungMoney,谢谢您的提问。这正是我所需要的。组件启用状态默认值是否总是表示它已启用?我认为它提供了默认启用状态-例如,如果在清单中启用=false,那么组件启用状态默认值将等于组件启用状态禁用。我还没试过。嗨!你能解决这个问题吗?