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. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође