Планирование задач

Если вы хотите выполнять задачи, которые будут продолжать работать, даже когда приложение не находится в видимом состоянии, рекомендуем использовать библиотеку Jetpack WorkManager. WorkManager имеет надежный механизм планирования, который позволяет сохранять задачи при перезапуске приложения и перезагрузке устройства.

Типы работ

WorkManager обрабатывает три типа задач:

  • Немедленно. Задачи, которые должны начаться немедленно и завершиться в ближайшее время. Может быть ускорено.
  • Длительные задачи. Задачи, выполнение которых может занять больше времени, возможно, более 10 минут.
  • Откладываемые. Запланированные задачи, которые запускаются позже и могут выполняться периодически.

На рисунке 1 показано, как разные типы задач связаны друг с другом.

Постоянная работа может быть немедленной, длительной или отложенной.
Рисунок 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 в своем приложении, ознакомьтесь с кратким руководством.

Дополнительные ресурсы

Ниже приведены ссылки на дополнительные ресурсы.

Видео

Блоги

Образцы