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.
Надеюсь, я сделал это ясно, спасибо за любую помощь.
Ответы
Ответ 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);
}
}