关于broadcastreceiver:Android-如何注销清单中创建的接收器?

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中重新注册。

希望我能说清楚,谢谢您的帮助。


您可以使用PackageManager启用/禁用清单中声明的BroadcastReceiverBroadcast Receiver仅在启用时会被触发。

使用它来创建一个组件

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