AlarmManager не установлен или не стреляет в Зефир после определенного времени
Я успешно использовал следующую конструкцию для запуска AlarmManager в некоторых моих приложениях до Android 5:
Intent serviceIntent = new Intent(context, MyService.class);
PendingIntent pi = PendingIntent.getService(context, alarmId, serviceIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
DateTime inMinutes = (new DateTime()).plusMinutes(60);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, inMinutes.getMillis(), pi);
Но начиная с Зефира, AlarmManager либо не установлен, либо не срабатывает после некоторого простоя. Кажется, что текущая сигнализация срабатывает еще раз, но тогда новый сигнал тревоги не будет установлен.
Я прочитал некоторую документацию, и это, скорее всего, о зефире доза. Поэтому я реализовал следующее (и проверил, что оно на самом деле выполняется):
Intent serviceIntent = new Intent(context, MyService.class);
PendingIntent pi = PendingIntent.getService(context, alarmId, serviceIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
DateTime inMinutes = (new DateTime()).plusMinutes(minutes);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if(Build.VERSION.SDK_INT >= 23)
am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, inMinutes.getMillis(), pi);
else {
if(Build.VERSION.SDK_INT >= 19) {
am.setExact(AlarmManager.RTC_WAKEUP, inMinutes.getMillis(), pi);
} else {
am.set(AlarmManager.RTC_WAKEUP, inMinutes.getMillis(), pi);
}
}
Это ничего не меняет.
Есть ли надежный способ установить и включить сигнализацию даже на Зефире после некоторого простоя?
1 ответ
Конечно, попробуйте с:
setAlarmClock(AlarmManager.AlarmClockInfo info, PendingIntent operation)
Режим ожидания не запускается, если вы установили будильник таким образом. Я проверил это на консоли.
Не забывайте, что AlarmClock Info имеют разные PendingIntent
тот setAlarmclock
,
ОБНОВИТЬ
Если вы хотите сделать простой будильник (не будильник).
это должно работать
setExactAndAllowWhileIdle(int type, long triggerAtMillis, PendingIntent operation)
Но я теперь, когда это не так. Итак, я начал искать и Google, и я нашел это. Возможный способ добавить приложение в белый список. Может быть setExactAndAllowWhileIdle
работает.
https://developer.android.com/training/monitoring-device-state/doze-standby.html?hl=es
Пользователи могут вручную настроить белый список в меню "Настройки"> "Аккумулятор"> "Оптимизация аккумулятора". Кроме того, система предоставляет приложениям возможность запрашивать у пользователей их белый список.
Приложение может запустить ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS, намереваясь направить пользователя непосредственно в Оптимизацию батареи, где они могут добавить приложение. Приложение, обладающее разрешением REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, может вызвать системное диалоговое окно, позволяющее пользователю добавить приложение в белый список напрямую, без перехода в настройки. Приложение запускает ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS Intent для запуска диалога. Пользователь может вручную удалить приложения из белого списка по мере необходимости. Прежде чем просить пользователя добавить ваше приложение в белый список, убедитесь, что приложение соответствует приемлемым вариантам использования для белого списка.