Я успешно использовал следующую конструкцию для запуска 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);
Но начиная с Marshmallow, AlarmManager либо не установлен, либо больше не срабатывает после некоторого простоя. Кажется, что текущий будильник срабатывает еще раз, но тогда новый будильник не будет установлен.
Я прочитал кое-какую документацию, и, скорее всего, речь идет о Marshmallow Doze. Итак, я реализовал следующее (и проверил, что он действительно выполняется):
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);
}
}
Это ничего не меняет.
Есть ли надежный способ установить и активировать сигнализацию даже на Marshmallow после некоторого простоя?