WorkManager — какво е това, API и планиране на задачи

Автор: IT Sectr Публикувано: 2026-03-27 Време за четене: 8 мин

WorkManager е Jetpack библиотека за Android, предназначена за изпълнение на отложени и фонови задачи с гаранция за изпълнение. За разлика от Service или JobScheduler, WorkManager поема управлението на жизнения цикъл на задачата: рестартира я при отказ, адаптира се към версията на Android и взема предвид ограниченията на устройството. Според Android Developers, 2026, WorkManager е предпочитаното решение за повечето фонови операции в съвременната Android разработка.

Основно

  • WorkManager — это Jetpack-библиотека для фоновых задач с гарантированным выполнением, независимо от версии Android.
  • Worker — базовый класс для определения логики фоновой задачи, которую библиотека выполняет в отдельном потоке.
  • WorkRequest бывает одноразовым (OneTimeWorkRequest) и периодическим (PeriodicWorkRequest) с минимальным интервалом 15 минут.
  • Цепочки задач позволяют выстраивать последовательное или параллельное выполнение нескольких Worker-ов.
  • Ограничения (constraints) задают условия запуска: заряд батареи, подключение к сети, состояние хранилища.

Что такое WorkManager?

WorkManager — это часть Android Jetpack, библиотека для управления фоновыми задачами, которые должны выполниться гарантированно, независимо от того, находится приложение на переднем плане или было закрыто пользователем. Библиотека поддерживает API 14+ и автоматически выбирает подходящий механизм выполнения: JobScheduler на Android 5+, BroadcastReceiver + AlarmManager на более старых версиях.

Ключевая особенность WorkManager — гарантия выполнения. Если задача не была завершена из-за перезагрузки устройства, остановки приложения или сбоя, WorkManager перезапустит её при первой возможности. Это делает библиотеку идеальным выбором для задач, критичных к выполнению: отправка аналитики, синхронизация базы данных, загрузка логов.

В отличие от Background Service, WorkManager не требует управления потоками и жизненным циклом. Библиотека сама создаёт пул потоков, обрабатывает Doze Mode, учитывает версию Android и предоставляет единый API независимо от уровня API. Работа с корутинами и RxJava поддерживается через CoroutineWorker и RxWorker соответственно.

Наблюдение за состоянием через LiveData

WorkManager предоставляет встроенную поддержку LiveData для отслеживания состояния задач. Метод getWorkInfoByIdLiveData возвращает LiveData<WorkInfo>, которая обновляется при каждом изменении состояния: ENQUEUED, RUNNING, SUCCEEDED, FAILED, CANCELLED. Это позволяет UI-компонентам реагировать на изменения без ручного опроса планировщика и без утечек памяти благодаря Lifecycle-aware компонентам.

kotlin
WorkManager.getInstance(context)
    .getWorkInfoByIdLiveData(syncRequest.id)
    .observe(viewLifecycleOwner) { workInfo ->
        when (workInfo.state) {
            WorkInfo.State.SUCCEEDED ->
                showSuccess()
            WorkInfo.State.FAILED ->
                showError(workInfo.outputData)
            else ->
                showProgress()
        }
    }

Как работает WorkManager?

Архитектура WorkManager строится вокруг трёх базовых классов: Worker, WorkRequest и WorkManager. Worker содержит логику задачи, WorkRequest описывает параметры выполнения, а WorkManager управляет очередью и планированием. Библиотека использует внутреннюю базу данных Room для хранения состояния всех задач.

Worker и WorkRequest

Worker — это абстрактный класс с единственным методом doWork, который вызывается в фоновом потоке. Метод возвращает ListenableWorker.Result — SUCCESS, FAILURE или RETRY. WorkRequest связывает Worker с параметрами: тайм-аутом, тегом, начальной задержкой и ограничениями.

kotlin
class SyncWorker(
    context: Context,
    params: WorkerParameters
) : Worker(context, params) {

    override fun doWork(): Result {
        return try {
            val api = RetrofitClient.api
            val response = api.syncData()
            Result.success()
        } catch (e: Exception) {
            Result.retry()
        }
    }
}

Планирование выполнения через WorkManager

WorkManager единообразно планирует задачи вне зависимости от версии Android. При вызове enqueue библиотека сохраняет задачу в Room, оценивает текущие условия и выбирает оптимальное время запуска. Под капотом может использоваться JobScheduler, AlarmManager или собственный планировщик — разработчик об этом не задумывается.

kotlin
val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
    .setInitialDelay(15, TimeUnit.MINUTES)
    .addTag("sync")
    .build()

WorkManager.getInstance(context)
    .enqueue(syncRequest)

Типы WorkRequest

WorkManager поддерживает два типа запросов на выполнение: одноразовые и периодические. Выбор типа зависит от сценария: задача должна выполниться один раз или повторяться через заданный интервал.

OneTimeWorkRequest

OneTimeWorkRequest предназначен для задач, которые должны выполниться однократно. Это может быть отправка лога, синхронизация данных после авторизации, загрузка конфигурации при первом запуске. Задержка задаётся через setInitialDelay, а ограничения — через setConstraints.

PeriodicWorkRequest

PeriodicWorkRequest подходит для повторяющихся задач с минимальным интервалом 15 минут. Библиотека гарантирует, что интервал между запусками не будет меньше указанного, но может быть больше из-за ограничений устройства. Для задач с частотой менее 15 минут используйте Handler или Timer в Foreground Service.

ПараметрOneTimeWorkRequestPeriodicWorkRequest
Частотаоднократноповторно (мин. 15 мин)
Количество1 выполнениедо отмены
ЗадержкаsetInitialDelaysetInitialDelay
Цепочкиподдерживаетнет
Использованиезагрузка, синхронизациямониторинг, пуллинг

Настройка ограничений и цепочки задач

Ограничения (constraints) в WorkManager позволяют задать условия, при которых задача может быть запущена: подключение к сети (NetworkType), уровень заряда батареи ( batteryNotLow), состояние хранилища (StorageNotLow) и режим ожидания (DeviceIdle). Задача не запустится, пока все ограничения не будут выполнены.

kotlin
val constraints = Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .setRequiresCharging(true)
    .setRequiresBatteryNotLow(true)
    .build()

val request = OneTimeWorkRequestBuilder<ImageUploadWorker>()
    .setConstraints(constraints)
    .build()

Цепочки (chaining) позволяют организовать последовательное или параллельное выполнение задач. beginWith запускает цепочку, then добавляет следующий Worker, который выполнится после успешного завершения предыдущего. Для параллельного выполнения используется workManager.enqueue(listOf(request1, request2)).

kotlin
WorkManager.getInstance(context)
    .beginWith(compressWorker)
    .then(uploadWorker)
    .then(cleanupWorker)
    .enqueue()
    // compress → upload → cleanup последователно

Миграция с JobScheduler на WorkManager

JobScheduler был введён в Android 5 (API 21) как системный сервис для планирования фоновых задач. WorkManager пришёл на смену, предложив кроссплатформенный API с автоматической миграцией и дополнительными возможностями: цепочки, гарантия выполнения, теги, наблюдение за состоянием через LiveData.

При миграции с JobScheduler на WorkManager потребуется преобразовать JobService в Worker, заменить JobInfo на WorkRequest, а Context.getSystemService на WorkManager API. WorkManager автоматически решает проблемы совместимости и обрабатывает Doze Mode корректнее, чем ручная имплементация JobScheduler. Шаги миграции: 1) создать Worker-класс, 2) построить WorkRequest с теми же условиями, 3) удалить JobService и JobInfo из кода и манифеста.

UniqueWork для уникальных задач

WorkManager поддерживает концепцию уникальных задач через ExistingWorkPolicy. Если задача с указанным именем уже существует, политика определяет поведение: KEEP (не создавать новую), REPLACE (заменить существующую), APPEND (добавить в конец цепочки) и APPEND_OR_REPLACE. UniqueWorkRequest удобен для задач, которые не должны дублироваться: синхронизация базы данных, загрузка конфигурации, отправка пакета аналитики.

kotlin
WorkManager.getInstance(context)
    .enqueueUniqueWork(
        "sync_data",
        ExistingWorkPolicy.KEEP,
        syncRequest
    )

Обработка прогресса и промежуточных результатов

CoroutineWorker поддерживает механизм setProgress, позволяющий передавать промежуточные результаты выполнения задачи. Это полезно для длительных операций: загрузка большого файла, пакетная обработка изображений, миграция базы данных. UI может подписаться на обновления через getWorkInfosByTagLiveData и отображать прогресс в реальном времени. Доступен также метод ForegroundInfo для запуска Worker как Foreground Service с уведомлением, если задача должна быть видна пользователю.

kotlin
class ProgressWorker(
    context: Context,
    params: WorkerParameters
) : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result {
        val total = 100
        for (i in 1..total) {
            setProgress(
                workDataOf("progress" to i)
            )
        }
        return Result.success()
    }
}

InputData и OutputData для передачи данных

WorkManager поддерживает передачу данных между Worker-ами через InputData и OutputData. InputData создаётся на этапе построения WorkRequest через Data.Builder и передаётся в Worker через inputData. После выполнения Worker формирует OutputData через workDataOf или Data.Builder и возвращает вместе с Result.success(outputData). Следующий Worker в цепочке получает outputData предыдущего как свой inputData. Данные хранятся в формате ключ-значение с поддержкой базовых типов: String, Int, Long, Boolean, Double. Максимальный размер Data — 10 КБ.

На практике многие проекты используют WorkManager как единственный планировщик фоновых задач. Google рекомендует мигрировать все существующие JobService на WorkManager, особенно в приложениях, поддерживающих Android 4.4 (API 19) и ниже, где JobScheduler недоступен, а WorkManager использует резервный механизм через AlarmManager и BroadcastReceiver. Для тестирования WorkManager предоставляет TestListenableWorkerBuilder и TestWorkerBuilder, которые позволяют тестировать Worker-ов в JUnit-тестах без реального планировщика.

Для тестирования WorkManager используйте TestListenableWorkerBuilder из AndroidX Test, который позволяет запускать Worker в изолированном окружении и проверять возвращаемый Result. Библиотека предоставляет полную поддержку JUnit и Robolectric для модульного тестирования без реального планировщика. В целом WorkManager подходит для 80% задач, где раньше использовались Service или JobScheduler.

Часто задаваемые вопросы

Гарантирует ли WorkManager выполнение задачи после перезагрузки устройства?

Да, WorkManager гарантирует выполнение даже после перезагрузки. Библиотека сохраняет все незавершённые задачи в Room-базу данных и восстанавливает их при помощи BroadcastReceiver, который срабатывает после загрузки системы.

В чём разница между Worker, CoroutineWorker и RxWorker?

Worker работает в фоновом потоке без поддержки корутин или RxJava. CoroutineWorker использует Kotlin-корутины с поддержкой suspend-функций и отмены по корутинному scope. RxWorker работает с Observable и Single, подходит для реактивных цепочек.

Как отменить задачу в WorkManager?

Для отмены используйте workManager.cancelWorkById(id) или workManager.cancelAllWorkByTag("tag"). Библиотека также предоставляет метод cancelUniqueWork("name") для отмены уникальных задач с указанным именем.

Какой минимальный интервал для PeriodicWorkRequest?

Минимальный интервал для PeriodicWorkRequest составляет 15 минут. Это ограничение установлено Google для предотвращения чрезмерного расхода батареи. Если задача должна выполняться чаще, используйте Foreground Service или Handler с таймером.

Поддерживает ли WorkManager Android 4.4 и ниже?

Да, WorkManager поддерживает API 14+. На устройствах без JobScheduler (ниже API 21) библиотека использует комбинацию AlarmManager и BroadcastReceiver для планирования задач. Это делает WorkManager универсальным решением для фоновых задач.

Итоги

  • WorkManager — это современная Jetpack-библиотека для фоновых задач с гарантированным выполнением на всех версиях Android.
  • Три базовых класса — Worker, WorkRequest и WorkManager — покрывают все сценарии планирования и выполнения.
  • Два типа запросов — OneTimeWorkRequest и PeriodicWorkRequest — для однократных и повторяющихся задач.
  • Ограничения (сеть, заряд, хранилище) защищают задачу от выполнения в неблагоприятных условиях.
  • Цепочки задач обеспечивают последовательное выполнение Worker-ов с передачей результата.
  • CoroutineWorker и RxWorker поддерживают асинхронное программирование через корутины и RxJava.
  • WorkManager заменяет JobScheduler, Service и AlarmManager для большинства сценариев фоновых задач.

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също