Как работает WorkManager и когда он начинает выполнять задачи
Что проверяют
Понимаете ли вы, что это гарантированная, но не немедленная работа, и знаете ли, чем он отличается от корутин и сервиса.
Как отвечать
WorkManager это библиотека для фоновой работы, которая должна выполниться, даже если приложение закрыли или устройство перезагрузили. Задание описывается запросом, условия и параметры хранятся в базе, поэтому переживают перезапуск.
Два вида: OneTimeWorkRequest и PeriodicWorkRequest, у второго минимальный интервал пятнадцать минут.
Когда именно запустится, зависит от трёх вещей:
- ограничения: сеть, зарядка, свободное место, простой устройства. Пока условие не выполнено, задача ждёт;
- задержка и политика повторов:
setInitialDelay, при неудачеResult.retry()с линейным или экспоненциальным откатом; - система: под капотом JobScheduler, а он объединяет задания разных приложений в окна ради батареи. Плюс режимы Doze и ограничения на приложения в фоне: точного времени нет и быть не может, гарантируется факт выполнения, а не момент.
Отсюда правило выбора: нужно прямо сейчас и пока экран открыт, берите корутину в viewModelScope; нужно с уведомлением и на виду у пользователя, foreground-сервис; нужно надёжно, но не срочно (синхронизация, выгрузка, отправка аналитики), WorkManager.
Полезно назвать цепочки (beginWith, then), уникальные задачи с политикой замены (enqueueUniqueWork), передачу данных через Data и наблюдение за состоянием через WorkInfo.
Где спотыкаются
Ждут выполнения точно в срок и удивляются задержке в десятки минут.
Пытаются обновлять интерфейс прямо из Worker.
Кладут в Data большие объекты, хотя лимит там около 10 КБ.
Не задают уникальность задачи и получают дубли при каждом запуске приложения.