Android: активировать все пропущенные будильники при включении устройства

В моем приложении пользователь установил несколько напоминаний, и я должен предупредить их, когда придет время. В настоящее время я использую AlarmManager.RTC как тип AlarmManager

am.set(AlarmManager.RTC_WAKEUP, date.getTimeInMillis(), pendingIntent);

он в работе по инструкции

// Устанавливает будильник — обратите внимание, что этот будильник будет потерян, если телефон будет
// выключен и снова включен

можно ли как-нибудь включить пропущенные сигналы тревоги при включении устройства?

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

PS: я прочитал документацию http://developer.android.com/reference/android/app/AlarmManager.html#RTC, но я не нашел свой вариант.


person zzlalani    schedule 06.07.2014    source источник


Ответы (4)


можно ли как-нибудь включить пропущенные сигналы тревоги при включении устройства?

Шаг № 1: Имейте какой-нибудь способ самостоятельно отслеживать, что упущено, например, отслеживая статус события в базе данных.

Шаг № 2: Настройте BOOT_COMPLETED BroadcastReceiver, чтобы узнать, когда телефон перезагружается. Там запланируйте любые тревоги, которые все еще в будущем, и решите, что делать с тревогами, которые произошли в прошлом, но были пропущены (например, поднимите Notification, указывающий на пропущенные события).

person CommonsWare    schedule 06.07.2014
comment
Я также ищу решение, когда приложение обновляется через игру, все сигналы тревоги в это время теряются. Таким образом, вы получаете возможность установить новый будильник, если приложение запущено пользователем. Но это может быть поздно. Мой вопрос, как решить эту проблему? - person drindt; 10.06.2015
comment
@drindt: на данный момент все сигналы тревоги потеряны - я не знал, что это произошло. Я думаю, вы можете следить за ACTION_PACKAGE_REPLACED, чтобы узнать, что вы были обновлены, и снова настроить будильник. - person CommonsWare; 10.06.2015
comment
Спасибо за ваш ответ. Я нашел это: code.google.com/p/android/issues/ detail?id=61850 Но я этого не пробовал. - person drindt; 10.06.2015

Вам придется сделать это вручную.

Один из способов сделать это — прослушать событие выключения телефона:

<action android:name="android.intent.action.ACTION_SHUTDOWN" />

и перед выключением устройства сохраните время выключения.

Затем прослушайте загрузку устройства:

<action android:name="android.intent.action.BOOT_COMPLETED" />

и напишите свою собственную логику, определяющую, какие сигналы тревоги должны сработать во время этого простоя, и немедленно активируйте эти сигналы тревоги с помощью AlarmManager.

person JDJ    schedule 06.07.2014
comment
так что с android.permission.RECEIVE_BOOT_COMPLETED мое приложение автоматически запускается при загрузке? - person zzlalani; 06.07.2014
comment
Нет, это просто позволяет вашему приложению прослушивать, когда устройство загружается. Затем вы можете настроить широковещательный приемник, а в его onReceive() вы можете поместить свою логику для того, что вы хотите, чтобы происходило при загрузке устройства. - person JDJ; 06.07.2014

AlarmManager будет тревожить все ваши будильники, пока ваш телефон не будет включен.

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

Теперь этот единственный способ подходит — хранить треки в базе данных. Добавьте дополнительный класс, расширяющий BroadcastReceiver. Где в методе OnReceive() вы можете повторно генерировать свои сигналы тревоги при перезагрузке устройства. (очевидно, если у вас есть какой-то трек, т.е. база данных). Настройку BroadcastReceiver для ваших целей можно увидеть здесь Как запустить приложение при запуске?< /а>. Надеюсь это поможет.

person Muhammad Faraz    schedule 12.07.2014

Зарегистрируйте BroadReceiver в вашем Manifest.xml

<receiver
    android:name=".AlarmRestartReceiver"
    android:enabled="true">
    <intent-filter>
        <action 
          android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

После этого прослушивайте событие, когда устройство просыпается.

override fun onReceive(context: Context, intent: Intent?) {
   if (intent?.action == "android.intent.action.BOOT_COMPLETED") {
      // re-register all alarm here..
   }
}
person paulparkbom    schedule 19.02.2019