Включение и отключение широковещательного приемника
Я пытаюсь включить и отключить широковещательный приемник с помощью этого метода PackageManager:
setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
Радиовещательный приемник зарегистрирован в манифесте. Приемник работает нормально, но когда я пытаюсь его отключить, он все равно получает широковещательные сообщения.
Когда я отключу приемник в манифесте с помощью "android: enabled =" false ", получатель ничего не получает, но я не могу его включить.
Я вызываю метод изнутри службы.
PackageManager pm = getApplicationContext().getPackageManager();
ComponentName componentName = new ComponentName("com.app",
".broadcast_receivers.OnNetworkChangedReceiver");
pm.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
Android манифест:
<receiver android:name=".broadcast_receivers.OnNetworkChangedReceiver"
android:enabled="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
Получатель
public class OnNetworkChangedReceiver extends BroadcastReceiver {
private static final String TAG = "OnNetworkChangedReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "in OnNetworkChanged");
}
}
Я также вызвал метод изнутри Activity вчера. Я думал, что это сработало, но сегодня ничего не работает.
Может быть, иногда существует большая задержка в намерении (android.net.conn.CONNECTIVITY_CHANGE), которую я неправильно истолковал вчера как отключив приемник?
Является ли подход с PackageManager правильным направлением или есть основная ошибка в идее?
Большое спасибо,
Свен
Ответы
Ответ 1
Хорошо, что у вас в основном есть ОК. У меня есть следующий код в один из моих проектов:
boolean enabled=prefs.getBoolean(key, false);
int flag=(enabled ?
PackageManager.COMPONENT_ENABLED_STATE_ENABLED :
PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
ComponentName component=new ComponentName(EditPreferences.this, OnBootReceiver.class);
getPackageManager()
.setComponentEnabledSetting(component, flag,
PackageManager.DONT_KILL_APP);
Я использую это, чтобы отключить приемник BOOT_COMPLETED
, когда у меня нет активных аварийных сигналов, которые необходимо запланировать.
Я предполагаю, что ваш ComponentName
настроен неправильно (например, ваш ведущий .
). Попробуйте использовать конструктор, который я использую, который принимает параметры Context
и Class
.
Ответ 2
Я думаю, что использование PackageManager слишком задумывается о вашей ситуации. У вас есть BroadcastReceiver, который иногда должен игнорировать широковещательные передачи, которые он прослушивает. Я могу думать о двух простых способах этого:
1) Установите флаг, который ваш ресивер может проверить, чтобы игнорировать или принимать широковещательные сообщения, и не беспокойтесь о его включении/отключении.
2) Создайте BroadcastReceiver программно (может быть только внутренним классом, даже), и зарегистрируйте и отмените регистрацию, как вам нужно, в определенных частях вашего приложения.
В общем, я обнаружил, что определение моих BroadcastReceivers в коде вместо XML обеспечивает гораздо большую гибкость и, как правило, мне легче управлять.