Задумка в том, что приложение должно периодически (раз в 2-10 минут) будить спящее устройство, выполнять некоторую работу, после чего позволять устройству спать дальше.
Согласно официальной документации, для этих целей лучше всего подходит AlarmManager и его метод setExactAndAllowWhileIdle(…). При нормальном заряде аккумулятора, он срабатывает с точностью около 1 минуты. В режиме Doze, эти будильники не могут срабатывать чаще, чем раз в 9 минут (по другим источникам, 15 минут). Однако приложение можно добавить в "Белый список", который позволит ему игнорировать режим Doze.
Суть в том, что это всё теория. На практике же у меня выходит так, что Android в любом случае действует по собственному усмотрению, несмотря ни на "Точный будильник", ни на "Белый список", ни на частоту вызовов будильников. При одном запуске приложения он выполняет все будильники на протяжении полутора часов подряд; при другом – выполняет только один или два из них, а следующий откладывает до ручной разблокировки девайса, даже если она произойдёт только спустя час.
Так выглядит создание моего будильника:
AlarmManager alarmManager = (AlarmManager) appContext.getSystemService(Context.ALARM_SERVICE);
Intent alarmIntent = new Intent(appContext, WakeUpReceiver.class);
PendingIntent alarmPIntent = PendingIntent.getBroadcast(appContext, 0, alarmIntent, 0);
long trigger = System.currentTimeMillis() + 120_000;
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, trigger, alarmPIntent);
При срабатывании будильника, я выполняю свою работу и завожу будильник заново.
Если кому-то приходилось работать с будильниками, поделитесь опытом, были ли у вас подобные проблемы и как вы их решали. Спасибо!