Прототип для getBroadcast выглядит так:
getBroadcast(Context context, int requestCode, Intent intent, int flags)
Установка уникального 'requestCode' для каждого PendingIntent должна позволять планировать несколько аварий:
PendingIntent.getBroadcast(context, uniqueValue, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Для гарантированного пробуждения при критических тревогах пользователя:
void setAlarmClock (AlarmManager.AlarmClockInfo info,
PendingIntent operation)
Из документов:
«Запланируйте будильник, представляющий будильник, который будет использоваться для уведомления пользователя о его срабатывании. Ожидается, что при срабатывании этого будильника приложение дополнительно разбудит устройство, чтобы сообщить пользователю о включении будильника». на экране, воспроизводя звук, вибрируя и т. д. Таким образом, система, как правило, будет также использовать предоставленную здесь информацию, чтобы сообщить пользователю об этой предстоящей тревоге, если это необходимо.
В связи с характером этого типа аварийного сигнала, аналогичного setExactAndAllowWhileIdle (int, long, PendingIntent), эти аварийные сигналы будут разрешаться, даже если система находится в режиме ожидания с низким энергопотреблением (также известном как доза). "
Подведем итог:
- Используйте setAlarmClock, чтобы активировать устройство для представления информации пользователю.
- Используйте setExactAndAllowWhileIdle для выполнения работы в фоновом режиме, которая должна выполняться во время сна. Однако срабатывание этих аварийных сигналов может быть связано с задержками примерно от 1 минуты до 15 минут.
- Используйте FCM для пробуждения устройства в режиме реального времени из удаленного приложения. На практике многие приложения должны использовать FCM вместо setExactAndAllowWhileIdle, если это возможно.
- Используйте setExact, если точная синхронизация во время дозирования не важна. Кроме того, используйте setExact на устройствах до API 21 вместо setAlarmClock или setExactAndAllowWhileIdle ...
Окончательное решение Лутаайи:
AlarmManager.AlarmClockInfo(calendar.getTimeInMillis(),pendingIntent), pendingIntent);