WorkManager — co to je, API a plánování úkolů

Autor: IT Sectr Publikováno: 2026-03-27 Doba čtení: 8 min

WorkManager — je knihovna Jetpack pro Android určená k provádění odložených a úloh na pozadí se zárukou provedení. Na rozdíl od Service nebo JobScheduler přebírá WorkManager správu životního cyklu úlohy: restartuje ji při selhání, přizpůsobuje se verzi Androidu a zohledňuje omezení zařízení. Podle Android Developers, 2026 je WorkManager preferovaným řešením pro většinu operací na pozadí v moderním vývoji pro Android.

Hlavní body

  • WorkManager — je knihovna Jetpack pro úlohy na pozadí s garantovaným provedením, nezávisle na verzi Androidu.
  • Worker — základní třída pro definování logiky úlohy na pozadí, kterou knihovna provádí v samostatném vlákně.
  • WorkRequest může být jednorázový (OneTimeWorkRequest) nebo periodický (PeriodicWorkRequest) s minimálním intervalem 15 minut.
  • Řetězce úloh umožňují sestavit sekvenční nebo paralelní provádění více Workerů.
  • Omezení (constraints) nastavují podmínky spuštění: úroveň baterie, připojení k síti, stav úložiště.

Co je WorkManager?

WorkManager — je součástí Android Jetpack, knihovny pro správu úloh na pozadí, které musí být garantovaně provedeny, bez ohledu na to, zda je aplikace v popředí nebo byla uživatelem zavřena. Knihovna podporuje API 14+ a automaticky vybírá vhodný mechanismus provedení: JobScheduler na Androidu 5+, BroadcastReceiver + AlarmManager na starších verzích.

Klíčovou vlastností WorkManageru je záruka provedení. Pokud úloha nebyla dokončena kvůli restartu zařízení, zastavení aplikace nebo selhání, WorkManager ji při první příležitosti restartuje. To činí knihovnu ideální volbou pro úlohy kritické z hlediska provedení: odesílání analytiky, synchronizace databáze, nahrávání logů.

Na rozdíl od Background Service nevyžaduje WorkManager správu vláken a životního cyklu. Knihovna sama vytváří fond vláken, zpracovává Doze Mode, zohledňuje verzi Androidu a poskytuje jednotné API bez ohledu na úroveň API. Práce s korutinami a RxJava je podporována prostřednictvím CoroutineWorker a RxWorker.

Sledování stavu pomocí LiveData

WorkManager poskytuje vestavěnou podporu pro LiveData pro sledování stavu úloh. Metoda getWorkInfoByIdLiveData vrací LiveData<WorkInfo>, která se aktualizuje při každé změně stavu: ENQUEUED, RUNNING, SUCCEEDED, FAILED, CANCELLED. To umožňuje komponentám UI reagovat na změny bez ručního dotazování plánovače a bez úniků paměti díky komponentám s ohledem na životní cyklus.

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

Jak funguje WorkManager?

Architektura WorkManageru je postavena kolem tří základních tříd: Worker, WorkRequest a WorkManager. Worker obsahuje logiku úlohy, WorkRequest popisuje parametry provedení a WorkManager spravuje frontu a plánování. Knihovna používá interní databázi Room pro ukládání stavu všech úloh.

Worker a WorkRequest

Worker — je abstraktní třída s jedinou metodou doWork, která je volána na vlákně na pozadí. Metoda vrací ListenableWorker.Result — SUCCESS, FAILURE nebo RETRY. WorkRequest propojuje Worker s parametry: časový limit, značka, počáteční zpoždění a omezení.

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

Plánování prostřednictvím WorkManageru

WorkManager plánuje úlohy jednotně bez ohledu na verzi Androidu. Při volání enqueue knihovna uloží úlohu do Room, vyhodnotí aktuální podmínky a vybere optimální čas spuštění. Pod kapotou může být použit JobScheduler, AlarmManager nebo vlastní plánovač — vývojář o tom nemusí přemýšlet.

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

WorkManager.getInstance(context)
    .enqueue(syncRequest)

Typy WorkRequest

WorkManager podporuje dva typy požadavků na provedení: jednorázové a periodické. Výběr typu závisí na scénáři: úloha má být provedena jednou nebo opakovaně v daném intervalu.

OneTimeWorkRequest

OneTimeWorkRequest je určen pro úlohy, které mají být provedeny jednou. Může to být odeslání logu, synchronizace dat po autorizaci, načtení konfigurace při prvním spuštění. Zpoždění se nastavuje pomocí setInitialDelay a omezení pomocí setConstraints.

PeriodicWorkRequest

PeriodicWorkRequest je vhodný pro opakující se úlohy s minimálním intervalem 15 minut. Knihovna garantuje, že interval mezi spuštěními nebude kratší než uvedený, ale může být delší kvůli omezením zařízení. Pro úlohy s frekvencí kratší než 15 minut použijte Handler nebo Timer ve Foreground Service.

ParametrOneTimeWorkRequestPeriodicWorkRequest
Frekvencejednorázověopakovaně (min. 15 min)
Počet1 provedenído zrušení
ZpožděnísetInitialDelaysetInitialDelay
Řetězcepodporujene
Použitínačítání, synchronizacemonitorování, polling

Nastavení omezení a řetězce úloh

Omezení (constraints) ve WorkManageru umožňují nastavit podmínky, za kterých může být úloha spuštěna: připojení k síti (NetworkType), úroveň baterie (batteryNotLow), stav úložiště (StorageNotLow) a režim nečinnosti (DeviceIdle). Úloha se nespustí, dokud nejsou splněna všechna omezení.

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

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

Řetězce (chaining) umožňují organizovat sekvenční nebo paralelní provádění úloh. beginWith spouští řetězec, then přidává další Worker, který se provede po úspěšném dokončení předchozího. Pro paralelní provádění použijte workManager.enqueue(listOf(request1, request2)).

kotlin
WorkManager.getInstance(context)
    .beginWith(compressWorker)
    .then(uploadWorker)
    .then(cleanupWorker)
    .enqueue()
    // compress -> upload -> cleanup postupně

Migrace z JobScheduler na WorkManager

JobScheduler byl zaveden v Androidu 5 (API 21) jako systémová služba pro plánování úloh na pozadí. WorkManager přišel jako náhrada s multiplatformním API, automatickou migrací a dalšími možnostmi: řetězce, záruka provedení, značky, sledování stavu pomocí LiveData.

Při migraci z JobScheduler na WorkManager bude třeba převést JobService na Worker, nahradit JobInfo za WorkRequest a Context.getSystemService za API WorkManageru. WorkManager automaticky řeší problémy s kompatibilitou a zpracovává Doze Mode správněji než ruční implementace JobScheduleru. Kroky migrace: 1) vytvořte třídu Worker, 2) sestavte WorkRequest se stejnými podmínkami, 3) odstraňte JobService a JobInfo z kódu a manifestu.

UniqueWork pro jedinečné úlohy

WorkManager podporuje koncept jedinečných úloh prostřednictvím ExistingWorkPolicy. Pokud úloha se zadaným názvem již existuje, politika určuje chování: KEEP (nevytvářet novou), REPLACE (nahradit stávající), APPEND (přidat na konec řetězce) a APPEND_OR_REPLACE. UniqueWorkRequest je vhodný pro úlohy, které by se neměly duplikovat: synchronizace databáze, načítání konfigurace, odesílání balíčku analytiky.

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

Zpracování průběhu a průběžných výsledků

CoroutineWorker podporuje mechanismus setProgress, který umožňuje předávat průběžné výsledky úlohy. To je užitečné pro dlouhé operace: načítání velkého souboru, dávkové zpracování obrázků, migrace databáze. UI se může přihlásit k odběru aktualizací prostřednictvím getWorkInfosByTagLiveData a zobrazovat průběh v reálném čase. K dispozici je také metoda ForegroundInfo pro spuštění Workeru jako Foreground Service s oznámením, pokud má být úloha viditelná pro uživatele.

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 a OutputData pro přenos dat

WorkManager podporuje přenos dat mezi Workery prostřednictvím InputData a OutputData. InputData se vytváří při sestavování WorkRequest pomocí Data.Builder a předává se Workeru prostřednictvím inputData. Po provedení Worker vytvoří OutputData pomocí workDataOf nebo Data.Builder a vrátí ji spolu s Result.success(outputData). Další Worker v řetězci obdrží outputData předchozího jako svůj inputData. Data jsou uložena ve formátu klíč-hodnota s podporou základních typů: String, Int, Long, Boolean, Double. Maximální velikost Data je 10 KB.

V praxi mnoho projektů používá WorkManager jako jediný plánovač úloh na pozadí. Google doporučuje migrovat všechny stávající JobService na WorkManager, zejména v aplikacích podporujících Android 4.4 (API 19) a nižší, kde JobScheduler není k dispozici a WorkManager používá záložní mechanismus prostřednictvím AlarmManager a BroadcastReceiver. Pro testování poskytuje WorkManager TestListenableWorkerBuilder a TestWorkerBuilder, které umožňují testování Workerů v JUnit testech bez skutečného plánovače.

Pro testování WorkManageru použijte TestListenableWorkerBuilder z AndroidX Test, který umožňuje spustit Worker v izolovaném prostředí a zkontrolovat vrácený Result. Knihovna poskytuje plnou podporu JUnit a Robolectric pro modulární testování bez skutečného plánovače. WorkManager je vhodný pro 80 % úloh, kde se dříve používal Service nebo JobScheduler.

Často kladené otázky

Garantuje WorkManager provedení úlohy po restartu zařízení?

Ano, WorkManager garantuje provedení i po restartu. Knihovna ukládá všechny nedokončené úlohy do databáze Room a obnovuje je pomocí BroadcastReceiver, který se spustí po naběhnutí systému.

Jaký je rozdíl mezi Worker, CoroutineWorker a RxWorker?

Worker pracuje na vlákně na pozadí bez podpory korutin nebo RxJava. CoroutineWorker používá Kotlin-korutiny s podporou suspend funkcí a zrušení v rámci coroutine scope. RxWorker pracuje s Observable a Single, vhodný pro reaktivní řetězce.

Jak zrušit úlohu ve WorkManageru?

Pro zrušení použijte workManager.cancelWorkById(id) nebo workManager.cancelAllWorkByTag(“tag”). Knihovna také poskytuje metodu cancelUniqueWork(“name”) pro zrušení jedinečných úloh se zadaným názvem.

Jaký je minimální interval pro PeriodicWorkRequest?

Minimální interval pro PeriodicWorkRequest je 15 minut. Toto omezení bylo stanoveno Googlem pro zabránění nadměrné spotřebě baterie. Pokud musí být úloha prováděna častěji, použijte Foreground Service nebo Handler s časovačem.

Podporuje WorkManager Android 4.4 a nižší?

Ano, WorkManager podporuje API 14+. Na zařízeních bez JobScheduler (pod API 21) knihovna používá kombinaci AlarmManager a BroadcastReceiver pro plánování úloh. To činí WorkManager univerzálním řešením pro úlohy na pozadí.

Shrnutí

  • WorkManager — je moderní knihovna Jetpack pro úlohy na pozadí s garantovaným provedením na všech verzích Androidu.
  • Tři základní třídy — Worker, WorkRequest a WorkManager — pokrývají všechny scénáře plánování a provádění.
  • Dva typy požadavků — OneTimeWorkRequest a PeriodicWorkRequest — pro jednorázové a opakující se úlohy.
  • Omezení (síť, baterie, úložiště) chrání úlohu před provedením v nepříznivých podmínkách.
  • Řetězce úloh zajišťují sekvenční provádění Workerů s předáváním výsledku.
  • CoroutineWorker a RxWorker podporují asynchronní programování prostřednictvím korutin a RxJava.
  • WorkManager nahrazuje JobScheduler, Service a AlarmManager pro většinu scénářů úloh na pozadí.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také