Подтвердить что ты не робот

Android - как отменить регистрацию получателя, созданного в манифесте?

Я знаю об использовании registerReceiver и unregisterReceiver в Java-коде для работы с приемниками, но позвольте сказать, что в моем манифесте есть следующее:

    <receiver android:name=".headsetHook">
        <intent-filter android:priority="99999999999">
            <action android:name="android.intent.action.ACTION_HEADSET_PLUG" />
        </intent-filter>
    </receiver>

Есть ли способ, чтобы я мог отменить это где-нибудь в Java-коде? Могу ли я дать ему атрибут id или что-то еще, а затем получить его и отменить его? Я спрашиваю, потому что я хочу, чтобы мое приложение что-то делало только в первый раз, когда это действие происходит, затем отмените регистрацию и перепишите его позже на Java.

Надеюсь, я сделал это ясно, спасибо за любую помощь.

4b9b3361

Ответ 1

Вы можете использовать PackageManager для включения/выключения BroadcastReceiver, объявленного в манифесте. Broadcast Receiver будет запущен только тогда, когда он включен.

Используйте это для создания компонента

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

Ответ 2

Основываясь на ответе Варуна, я создал этот утилитарный метод

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