Как остановить AlarmManager

#android #alarmmanager #android-pendingintent

#Android #alarmmanager #android-pendingintent

Вопрос:

У меня есть действие A, оно регистрирует AlarmManager для запуска другого BroadcastReceiver B. По истечении времени будет вызван onReceive () из B и запущено другое действие C. A может быть закрыт при запуске C.

Моя проблема в следующем: — C не знает PendingIntent в A, как я могу вызвать AlarmManager.cancel(PendingIntent) в C? — Или, как я могу передать PendingIntent из A в B в C?

Пожалуйста, помогите.

Ответ №1:

В моем приложении я создал статический метод, который возвращал PendingIntent необходимое для AlarmManager значение, а затем я могу вызвать его из любого класса. Если у вас есть PendingIntent , который не меняется между вызовами, это может сработать для вас. Например, у меня есть:

 public static PendingIntent getSyncPendingIntent(Context context)
    {
        Intent i = new Intent(context, <classname>.class);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
        return pi;  
    }
  

И я могу просто вызвать это из любого класса, чтобы получить то же самое PendingIntent .

Комментарии:

1. Спасибо! Это работает 🙂 наконец, я объявляю AlarmManager и PendingIntent статическими и создаю статическую функцию cancel() в A.

2. Рад слышать, что это сработало: мне потребовалось некоторое время, чтобы придумать это, когда я столкнулся с такой же ситуацией.

3. Возникла проблема: Запустите AlarmManager в A -> Уничтожьте A с помощью Task Killer -> Сработал BroadcastReceiver B -> C -> Вызовите статический A.отмена(). статический AlarmManager и pindingIntent больше не существуют! Неожиданно остановлен и не может уничтожить намерение.

4. Диспетчер аварийных сигналов не может быть статичным. Вы хотите получать alarm manager каждый раз при использовании getSystemService , но используйте статический метод PendingIntent, чтобы каждый раз получать новый, идентичный PendingIntent.

5. Спасибо, Феми! Я отлаживал свой зависающий виджет в течение нескольких дней. Я использовал диспетчер статических сигналов тревоги: P

Ответ №2:

Было бы намного проще управлять сигналом тревоги и его намерением в одноэлементном сервисе, чем пытаться передавать его от действия к действию, и гораздо менее хрупким (вы могли бы ввести Activity D где-нибудь посередине без необходимости в дальнейшем последовательном соединении намерений).

Ответ №3:

Вы можете зарегистрировать широковещательный приемник в A для прослушивания пользовательского действия, которое транслируется при запуске C

В действии A

 private BroadcastReceiver onActivityCStartedReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        //cancel the pendingIntent for the alarm here
    }
};
  

зарегистрируйте получателя

 registerReceiver(onActivityCStartedReceiver , new IntentFilter(ACTIVITY_C_STARTED_ACTION));
  

При вызове Activity C

 Intent i = new Intent(ACTIVITY_C_STARTED_ACTION);
context.sendBroadcast(i);
  

попробуйте! используйте систему обмена сообщениями для вашего блага: D

Комментарии:

1. Нужно ли поддерживать работу, чтобы AlarmManager и PendingIntent оставались неизменными? или объявлен как статический?

Ответ №4:

Чтобы отменить / уничтожить все службы, которые вы сгенерировали, обычно вам нужны те же переменные «pendingInetent» и «AlarmManager», которые вы использовали для запуска этих служб, например, если ваша предыдущая переменная — am_mngr и pndngInt, тогда используйте ее таким образом в вашем методе stopservice.

  am_mngr.cancel(pndngInt); // this will cancel the previous servicse...