Энергоэффективность: AlarmManager и setExactAndAllowWhileIdle ПРОТИВ службы и таймера

#java #android

Вопрос:

У меня есть приложение, которое изменяет фон с интервалом, который выбирает пользователь:

  • один раз в день: обои будут меняться вскоре после 00:00 следующего дня
  • раз в неделю: обои будут меняться вскоре после 00:00 в воскресенье или понедельник (это зависит от настроек вашей системы) на следующей неделе
  • раз в месяц: обои будут меняться вскоре после 00:00 1-го числа следующего месяца

Чтобы проверить, наступил ли новый день, используются Сервис и таймер.

 public class ServiceRefresh extends Service {
    //…
    public void checkTime() {
        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                // some checks
            }
        }, 0, 60000);
    }
}
 

На Android 8 таймер срабатывает примерно раз в час, а не раз в минуту. Тем не менее, это работает, и фон может измениться довольно близко к полуночи без активации экрана пользователем.

Я хотел бы изменить это на что-то лучшее.

Важный:

  • чтобы изменить фон, вам не нужно активировать экран
  • изменение фона должно произойти как можно ближе к полуночи

Я уже пробовал AlarmManager:

  • Повторное задание является неточным
  • setExactAndAllowWhileIdle (и setExact) запускается в точное время, но официальная документация не рекомендует его использовать из-за потребления энергии. Это меня смущает, потому что я не заметил никакого увеличения энергопотребления

Я также уже пробовал WorkManager. API 23 использует JobScheduler, что очень неточно. OneTimeWorkRequest один раз опоздал с выполнением задачи почти на 6 часов; PeriodicWorkRequest дает постоянный сдвиг во времени.

Из всего этого мне больше нравится AlarmManager, так какое решение будет лучшим с точки зрения энергоэффективности в моем случае: AlarmManager и setExactAndAllowWhileIdle или Сервис и таймер?

Комментарии:

1. Android все больше и больше избегает AlarmManager. WorkManager лучше всего подходит для повышения энергоэффективности, однако, как вы заметили, нет никакой гарантии, что он будет выполнен в нужное время.