Постоянная работа Часть Android Jetpack .

Работа считается постоянной, если она сохраняется в расписании при перезапуске приложения и системы. WorkManager — рекомендуемое решение для постоянной работы. Поскольку большая часть фоновой обработки лучше всего выполняется именно в режиме постоянной работы, WorkManager также является основным рекомендуемым API для фоновой обработки в целом.

Виды постоянной работы

WorkManager обрабатывает три типа постоянной работы:

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

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

Постоянная работа может быть немедленной, длительной или отложенной.
Рисунок 1 : Типы постоянной работы.

Аналогичным образом, в следующей таблице описываются различные виды работ.

Тип Периодичность Как получить доступ
Немедленный Один раз OneTimeWorkRequest и Worker . Для ускорения работы вызовите setExpedited() в OneTimeWorkRequest.
Длительный бег Разовое или периодическое Любой WorkRequest или Worker . Вызовите setForeground() в Worker для обработки уведомления.
Отсрочка Разовое или периодическое PeriodicWorkRequest и Worker .

Дополнительную информацию о настройке WorkManager см. в руководстве Определение WorkRequests .

Возможности WorkManager

Помимо предоставления более простого и последовательного API, WorkManager имеет ряд других ключевых преимуществ:

Ограничения в работе

Декларативно определите оптимальные условия для выполнения вашей работы с помощью ограничений работы . Например, запустите её только тогда, когда устройство подключено к сети без тарифного плана, находится в режиме ожидания или имеет достаточный заряд батареи.

Надежное планирование

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

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

Кроме того, WorkManager придерживается функций энергосбережения и лучших практик, таких как режим Doze , так что вам не о чем беспокоиться.

Ускоренная работа

WorkManager можно использовать для планирования срочных задач, которые будут выполняться в фоновом режиме. Для задач, важных для пользователя и завершающихся в течение нескольких минут, следует использовать функцию ускоренной работы .

Гибкая политика повторных попыток

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

Цепочка работ

Для сложных взаимосвязанных работ объединяйте отдельные рабочие задачи с помощью интуитивно понятного интерфейса, который позволяет контролировать, какие части выполняются последовательно, а какие — параллельно.

Котлин

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)
        }
    )

Ява

WorkManager.getInstance(...)
.beginWith(Arrays.asList(workA, workB))
.then(workC)
.enqueue();

Для каждой рабочей задачи вы можете определить входные и выходные данные . При объединении задач в цепочку WorkManager автоматически передаёт выходные данные из одной рабочей задачи в другую.

Встроенная совместимость потоков

WorkManager легко интегрируется с Coroutines и RxJava и обеспечивает гибкость для подключения ваших собственных асинхронных API .

Используйте WorkManager для надежной работы

WorkManager предназначен для задач, которые должны выполняться надёжно даже в случае, если пользователь закрывает экран, приложение закрывается или устройство перезагружается. Например:

  • Отправка журналов или аналитики на внутренние службы.
  • Периодическая синхронизация данных приложения с сервером.

WorkManager не предназначен для фоновой работы, которую можно безопасно завершить при завершении процесса приложения. Он также не является универсальным решением для всех задач, требующих немедленного выполнения. Ознакомьтесь с руководством по фоновой работе, чтобы выбрать решение, соответствующее вашим потребностям.

Связь с другими API

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

API Рекомендуется для Связь с WorkManager
Корутины Любая асинхронная работа, которая не должна быть постоянной. Корутины — стандартный способ выхода из основного потока в Kotlin. Однако они освобождают память после закрытия приложения. Для постоянной работы используйте WorkManager.
AlarmManager Только будильники. В отличие от WorkManager, AlarmManager выводит устройство из режима Doze. Поэтому он неэффективен с точки зрения энергопотребления и управления ресурсами. Используйте его только для точных будильников или уведомлений, таких как события календаря, а не для фоновой работы.

Заменить устаревшие API

WorkManager API является рекомендуемой заменой предыдущих API фонового планирования Android, включая FirebaseJobDispatcher и GcmNetworkManager .

Начать

Ознакомьтесь с руководством по началу работы , чтобы начать использовать WorkManager в своем приложении.

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

В следующих разделах представлены некоторые дополнительные ресурсы.

Видео

Блоги

Образцы