Если вы хотите выполнять задачи, которые будут продолжать работать, даже когда приложение не находится в видимом состоянии, рекомендуем использовать библиотеку Jetpack WorkManager. WorkManager имеет надежный механизм планирования, который позволяет сохранять задачи при перезапуске приложения и перезагрузке устройства.
Типы работ
WorkManager обрабатывает три типа задач:
- Немедленно. Задачи, которые должны начаться немедленно и завершиться в ближайшее время. Может быть ускорено.
- Длительные задачи. Задачи, выполнение которых может занять больше времени, возможно, более 10 минут.
- Откладываемые. Запланированные задачи, которые запускаются позже и могут выполняться периодически.
На рисунке 1 показано, как разные типы задач связаны друг с другом.
В таблице ниже приведены различные типы работ.
| Тип | Периодичность | Как найти ссылку |
|---|---|---|
| Немедленный | Один раз | OneTimeWorkRequest и Worker. Чтобы запустить приоритетную задачу, вызовите setExpedited() в OneTimeWorkRequest. |
| Длительное выполнение | Однократно или периодически | Любое значение WorkRequest или Worker. Вызовите setForeground() в Worker, чтобы обработать уведомление. |
| Откладываемый | Однократно или периодически | PeriodicWorkRequest и Worker. |
Дополнительную информацию о настройке WorkManager можно найти в руководстве по определению WorkRequest.
Функции WorkManager
Помимо простого и согласованного API, у WorkManager есть ряд других ключевых преимуществ:
Ограничения на работе
Декларативно определите оптимальные условия для выполнения вашей работы, используя ограничения работы. Например, только когда устройство подключено к сети с безлимитным тарифом, не используется или имеет достаточный заряд батареи.
Надежное планирование
WorkManager позволяет планировать задачи, которые должны выполняться один раз или повторяться, используя гибкие окна планирования. Работу можно помечать тегами и называть, что позволяет планировать уникальную заменяемую работу, а также отслеживать или отменять группы работ вместе.
Запланированные задачи хранятся во внутренней базе данных SQLite, а WorkManager обеспечивает их сохранение и повторное планирование при перезагрузке устройства.
Кроме того, WorkManager поддерживает функции энергосбережения и рекомендации, такие как спящий режим, поэтому вам не нужно беспокоиться об этом.
Приоритетная задача
Вы можете использовать WorkManager, чтобы запланировать немедленное выполнение работы в фоновом режиме. Приоритетные задачи важны для пользователя и выполняются за несколько минут.
Гибкие правила повторных попыток
Иногда работа не удается. WorkManager предлагает гибкие правила повторных попыток, в том числе настраиваемое правило экспоненциальной выдержки.
Цепочки задач
Для сложных связанных задач объединяйте отдельные рабочие задачи с помощью интуитивно понятного интерфейса, который позволяет контролировать, какие части выполняются последовательно, а какие – параллельно.
Kotlin
val continuation = WorkManager.getInstance(context) .beginUniqueWork( Constants.IMAGE_MANIPULATION_WORK_NAME, ExistingWorkPolicy.REPLACE, OneTimeWorkRequest.from(CleanupWorker::class.java) ).then(OneTimeWorkRequest.from(WaterColorFilterWorker::class.java)) .then(OneTimeWorkRequest.from(GrayScaleFilterWorker::class.java)) .then(OneTimeWorkRequest.from(BlurEffectFilterWorker::class.java)) .then( if (save) { workRequest<SaveImageToGalleryWorker>(tag = Constants.TAG_OUTPUT) } else /* upload */ { workRequest<UploadWorker>(tag = Constants.TAG_OUTPUT) } )
Java
WorkManager.getInstance(...) .beginWith(Arrays.asList(workA, workB)) .then(workC) .enqueue();
Для каждой рабочей задачи можно определить входные и выходные данные. При объединении задач в цепочку WorkManager автоматически передает выходные данные одной задачи следующей.
Встроенная совместимость цепочек
WorkManager легко интегрируется с Coroutines и RxJava, а также позволяет подключать собственные асинхронные API.
Используйте WorkManager для надежной работы
WorkManager предназначен для задач, которые должны выполняться надежно, даже если пользователь уходит с экрана, приложение закрывается или устройство перезапускается. Пример:
- Отправка журналов или аналитики в бэкенд-службы.
- Периодическая синхронизация данных приложения с сервером.
WorkManager не предназначен для фоновых процессов, которые можно безопасно завершить, если процесс приложения прекратится. Это также не является общим решением для всех работ, требующих немедленного выполнения. Ознакомьтесь с руководством по фоновой обработке, чтобы выбрать подходящее решение.
Связь с другими API
В этой таблице показано, как WorkManager связан с похожими API. Эта информация поможет вам выбрать API, который лучше всего подходит для вашего приложения.
| API | Рекомендованное применение | Связь с WorkManager |
|---|---|---|
| Сопрограммы | Все асинхронные задачи, которые не нужно сохранять, если приложение переходит в невидимое состояние. | Сопрограммы – это стандартный способ покинуть основной поток в Kotlin. но прекращаются, как только приложение закрывается. Если задача должна выполняться даже после закрытия приложения, используйте WorkManager. |
| AlarmManager | Только будильники. | В отличие от обычных воркеров WorkManager, точные будильники AlarmManager выводят устройство из спящего режима. Поэтому такой подход неэффективен с точки зрения управления питанием и ресурсами. Используйте его только для точных будильников или уведомлений, например о мероприятиях в календаре, а не для повторяющихся фоновых задач. |
Замените устаревшие API
WorkManager API рекомендуется использовать вместо предыдущих API для планирования фоновых задач в Android, включая FirebaseJobDispatcher и GcmNetworkManager.
Начать
Чтобы начать использовать WorkManager в своем приложении, ознакомьтесь с кратким руководством.
Дополнительные ресурсы
Ниже приведены ссылки на дополнительные ресурсы.
Видео
- Workmanager – MAD Skills (серия видео)
- Работа с WorkManager, Саммит для разработчиков Android 2018 г.
- WorkManager: Beyond the basics (WorkManager: дополнительные сведения), Android Dev Summit 2019.