Включение и отключение широковещательного приемника

Я пытаюсь включить и отключить широковещательный приемник с помощью этого метода 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 обеспечивает гораздо большую гибкость и, как правило, мне легче управлять.