#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 лучше всего подходит для повышения энергоэффективности, однако, как вы заметили, нет никакой гарантии, что он будет выполнен в нужное время.