Alarmmanager ВСЕГДА очищается после перезагрузки?

Простой вопрос: AlarmManager всегда очищается после перезагрузки? Очищается ли он после перезагрузки на всех устройствах и даже когда пользователь загружает свое устройство вскоре после его загрузки?

Мне нужно это знать, потому что я воссоздаю будильник своего приложения в OnBootReceiver и хочу избежать установки двойных будильников.


person Xander    schedule 04.05.2013    source источник


Ответы (1)


всегда ли AlarmManager очищается после перезагрузки?

Обязательно при полной перезагрузке. Есть некоторые устройства, которые имеют "быструю загрузку" (на ум приходит HTC), и я не проводил экспериментов, чтобы увидеть, каково там поведение.

и даже когда пользователь загружает свое устройство вскоре после того, как он его загрузил?

Да.

Мне нужно это знать, потому что я воссоздаю будильник своего приложения в OnBootReceiver и хочу избежать установки двойных будильников.

Аварийные сигналы фактически находятся в HashMap с клавишами PendingIntent. Установка будильника с использованием эквивалентного PendingIntent должна заменить предыдущий будильник. Под «эквивалентом» я подразумеваю:

  • Та же операция (активность, услуга, трансляция)
  • Тот же код запроса
  • Эквивалент Intent (соответствует через filterEquals(), что в значительной степени означает совпадение во всем, кроме дополнений)
  • И я бы нервничал по поводу использования FLAG_CANCEL_CURRENT при определении нового PendingIntent

Вы можете использовать adb shell dumpsys alarm для подтверждения того, какие будильники установлены, так что вы будете уверены, что получите правильное количество будильников.

person CommonsWare    schedule 04.05.2013
comment
Так что, возможно, было бы неплохо сначала вызвать cancel() в OnBootReceiver, а после этого вызвать set()? - person Xander; 04.05.2013
comment
@Merlin: Лично я не знаю ни одного сценария, в котором это требуется. Например, быстрая загрузка HTC не вызывает ACTION_BOOT_COMPLETED. При этом вы, безусловно, можете это сделать — cancel() не должно быть проблем, если для этого PendingIntent нет существующего сигнала тревоги. - person CommonsWare; 04.05.2013
comment
Ага, мой OnBootReceiver тоже получает android.intent.action.QUICKBOOT_POWERON (на случай, если будильники отменяются в quickboot), так что я просто отменю его перед установкой. Спасибо за помощь! - person Xander; 04.05.2013