Включить и отключить широковещательный приемник - PullRequest
41 голосов
/ 11 апреля 2011

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

Большое спасибо, Свен

Ответы [ 2 ]

73 голосов
/ 11 апреля 2011

Ну, то, что у вас есть, кажется нормальным.У меня есть следующий код в одном из моих проектов :

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 в качестве параметров.

4 голосов
/ 11 апреля 2011

Я думаю, что использование PackageManager слишком продуманно для вашей ситуации.У вас есть BroadcastReceiver, который иногда должен игнорировать те трансляции, которые он прослушивает.Я могу придумать два простых способа сделать это:

1) Установите флаг, который ваш приемник может проверять, чтобы игнорировать или принимать широковещательные сообщения, и вообще не беспокоиться о его включении / отключении.

2) Создайте BroadcastReceiver программно (даже может быть просто внутренним классом), зарегистрируйте и отмените его регистрацию по мере необходимости в определенных частях вашего приложения.

В общем, я обнаружил, что определение моегоBroadcastReceivers в коде вместо XML обеспечивает гораздо большую гибкость и, как правило, мне легче управлять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...