@antaki93
Пишу под Android.

Как заставить спящее Android-устройство периодически просыпаться и делать полезную работу?

Задумка в том, что приложение должно периодически (раз в 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);

При срабатывании будильника, я выполняю свою работу и завожу будильник заново.

Если кому-то приходилось работать с будильниками, поделитесь опытом, были ли у вас подобные проблемы и как вы их решали. Спасибо!
  • Вопрос задан
  • 494 просмотра
Пригласить эксперта
Ответы на вопрос 1
TrueBers
@TrueBers
Гуглю за еду
Точно срабатывать ничего не будет после 7-й версии андроида. Это делается специально, чтобы на каждый чих не сжирали аккумулятор особо криворукие разработчики. Сейчас рекомендуется пользоваться JobScheduler.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы