WorkManager — mi ez, API és feladatütemezés

Szerző: IT Sectr Megjelenés: 2026-03-27 Olvasási idő: 8 perc

WorkManager — egy Android Jetpack-könyvtár, amely késleltetett és háttérfeladatok végrehajtására szolgál végrehajtási garanciával. Ellentétben a Service-szel vagy a JobScheduler-rel, a WorkManager átveszi a feladat életciklusának kezelését: újraindítja hiba esetén, alkalmazkodik az Android verziójához, és figyelembe veszi az eszköz korlátait. A Android Developers, 2026 szerint a WorkManager az előnyben részesített megoldás a legtöbb háttérművelethez a modern Android-fejlesztésben.

Főbb pontok

  • WorkManager — egy Jetpack-könyvtár háttérfeladatokhoz garantált végrehajtással, az Android verziójától függetlenül.
  • Worker — az alaposztály a háttérfeladat logikájának meghatározásához, amelyet a könyvtár egy külön szálon hajt végre.
  • WorkRequest lehet egyszeri (OneTimeWorkRequest) vagy ismétlődő (PeriodicWorkRequest), minimum 15 perces időközzel.
  • Feladatkötések lehetővé teszik több Worker egymás utáni vagy párhuzamos végrehajtását.
  • Korlátozások (constraints) határozzák meg az indítási feltételeket: akkumulátorszint, hálózati kapcsolat, tárhely állapota.

Mi az a WorkManager?

WorkManager — az Android Jetpack része, egy könyvtár háttérfeladatok kezelésére, amelyeket garantáltan végre kell hajtani, függetlenül attól, hogy az alkalmazás az előtérben van, vagy a felhasználó bezárta. A könyvtár támogatja az API 14+-t, és automatikusan kiválasztja a megfelelő végrehajtási mechanizmust: JobScheduler Android 5+-on, BroadcastReceiver + AlarmManager régebbi verziókon.

A WorkManager legfontosabb jellemzője a végrehajtási garancia. Ha egy feladat nem fejeződött be az eszköz újraindítása, az alkalmazás leállása vagy hiba miatt, a WorkManager az első adandó alkalommal újraindítja. Ez teszi a könyvtárat ideális választássá a végrehajtás szempontjából kritikus feladatokhoz: analitika küldése, adatbázis-szinkronizálás, naplók feltöltése.

Ellentétben a Background Service-szel, a WorkManager nem igényel szál- és életciklus-kezelést. A könyvtár maga hoz létre szálkészletet, kezeli a Doze Mode-ot, figyelembe veszi az Android verzióját, és egységes API-t biztosít az API-szinttől függetlenül. A korutinekkel és RxJava-val való munka a CoroutineWorker-en és az RxWorker-en keresztül támogatott.

Állapotfigyelés LiveData-n keresztül

A WorkManager beépített támogatást nyújt a LiveData-hoz a feladatok állapotának nyomon követéséhez. A getWorkInfoByIdLiveData metódus LiveData<WorkInfo> objektumot ad vissza, amely minden állapotváltozáskor frissül: ENQUEUED, RUNNING, SUCCEEDED, FAILED, CANCELLED. Ez lehetővé teszi az UI-komponensek számára, hogy reagáljanak a változásokra az ütemező manuális lekérdezése nélkül, és memóriaszivárgás nélkül a Lifecycle-aware komponenseknek köszönhetően.

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

Hogyan működik a WorkManager?

A WorkManager architektúrája három alaposztály köré épül: Worker, WorkRequest és WorkManager. A Worker tartalmazza a feladat logikáját, a WorkRequest leírja a végrehajtási paramétereket, a WorkManager pedig kezeli a várakozási sort és az ütemezést. A könyvtár egy belső Room-adatbázist használ az összes feladat állapotának tárolására.

Worker és WorkRequest

Worker — egy absztrakt osztály egyetlen doWork metódussal, amelyet egy háttérszálon hívnak meg. A metódus ListenableWorker.Result-ot ad vissza — SUCCESS, FAILURE vagy RETRY. A WorkRequest összeköti a Worker-t a paraméterekkel: időtúllépés, címke, kezdeti késleltetés és korlátozások.

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

Ütemezés a WorkManager-en keresztül

WorkManager egységesen ütemezi a feladatokat az Android verziójától függetlenül. Az enqueue hívásakor a könyvtár elmenti a feladatot a Room-ba, kiértékeli az aktuális körülményeket, és kiválasztja az optimális indítási időt. A motorháztető alatt JobScheduler, AlarmManager vagy saját ütemező használható — a fejlesztőnek ezzel nem kell foglalkoznia.

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

WorkManager.getInstance(context)
    .enqueue(syncRequest)

WorkRequest típusok

WorkManager két típusú végrehajtási kérést támogat: egyszeri és ismétlődő. A típus kiválasztása a forgatókönyvtől függ: a feladatot egyszer kell végrehajtani, vagy ismétlődően egy adott időközönként.

OneTimeWorkRequest

OneTimeWorkRequest olyan feladatokhoz készült, amelyeket egyszer kell végrehajtani. Ez lehet napló küldése, adatok szinkronizálása engedélyezés után, konfiguráció betöltése az első indításkor. A késleltetés a setInitialDelay segítségével, a korlátozások a setConstraints segítségével állíthatók be.

PeriodicWorkRequest

PeriodicWorkRequest ismétlődő feladatokhoz alkalmas, minimum 15 perces időközzel. A könyvtár garantálja, hogy a végrehajtások közötti időköz nem lesz rövidebb a megadottnál, de az eszköz korlátainak függvényében hosszabb lehet. 15 percnél gyakoribb feladatokhoz használjon Handlert vagy Timert egy Foreground Service-ben.

ParaméterOneTimeWorkRequestPeriodicWorkRequest
Gyakoriságegyszeriismétlődő (min. 15 perc)
Mennyiség1 végrehajtástörlésig
KésleltetéssetInitialDelaysetInitialDelay
Kötésektámogatjanem
Használatbetöltés, szinkronizálásmonitoring, polling

Korlátozások beállítása és feladatkötések

Korlátozások (constraints) a WorkManagerben lehetővé teszik a feladat indításának feltételeit: hálózati kapcsolat (NetworkType), akkumulátorszint (batteryNotLow), tárhely állapota (StorageNotLow) és tétlen mód (DeviceIdle). A feladat nem indul el, amíg az összes korlátozás nem teljesül.

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

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

Kötések (chaining) lehetővé teszik a feladatok egymás utáni vagy párhuzamos végrehajtásának megszervezését. A beginWith elindít egy láncot, a then hozzáadja a következő Worker-t, amely az előző sikeres befejezése után fut le. Párhuzamos végrehajtáshoz használja a workManager.enqueue(listOf(request1, request2)) parancsot.

kotlin
WorkManager.getInstance(context)
    .beginWith(compressWorker)
    .then(uploadWorker)
    .then(cleanupWorker)
    .enqueue()
    // compress -> upload -> cleanup egymás után

Migráció JobScheduler-ről WorkManager-re

JobScheduler az Android 5-ben (API 21) került bevezetésre rendszerszolgáltatásként a háttérfeladatok ütemezésére. A WorkManager váltotta fel, keresztplatformos API-val, automatikus migrációval és további képességekkel: láncok, végrehajtási garancia, címkék, állapotfigyelés LiveData-n keresztül.

A JobScheduler-ről WorkManager-re való migráció során a JobService-t Worker-re kell alakítani, a JobInfo-t WorkRequest-re cserélni, a Context.getSystemService-t pedig WorkManager API-ra. A WorkManager automatikusan megoldja a kompatibilitási problémákat, és helyesebben kezeli a Doze Mode-ot, mint a JobScheduler kézi implementációja. Migrációs lépések: 1) hozzon létre egy Worker osztályt, 2) építsen fel egy WorkRequest-ot ugyanazokkal a feltételekkel, 3) távolítsa el a JobService-t és a JobInfo-t a kódból és a manifestből.

UniqueWork egyedi feladatokhoz

A WorkManager támogatja az egyedi feladatok koncepcióját az ExistingWorkPolicy segítségével. Ha egy adott nevű feladat már létezik, a szabályzat határozza meg a viselkedést: KEEP (ne hozzon létre újat), REPLACE (cserélje le a meglévőt), APPEND (adja hozzá a lánc végéhez) és APPEND_OR_REPLACE. A UniqueWorkRequest olyan feladatokhoz praktikus, amelyek nem duplikálódhatnak: adatbázis-szinkronizálás, konfiguráció betöltése, analitikai csomag küldése.

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

Előrehaladás és köztes eredmények kezelése

A CoroutineWorker támogatja a setProgress mechanizmust, amely lehetővé teszi a feladat köztes eredményeinek átadását. Ez hosszú műveleteknél hasznos: nagy fájl betöltése, képek kötegelt feldolgozása, adatbázis migráció. Az UI feliratkozhat a frissítésekre a getWorkInfosByTagLiveData segítségével, és valós időben megjelenítheti az előrehaladást. Elérhető a ForegroundInfo metódus is a Worker Foreground Service-ként történő elindításához értesítéssel, ha a feladatnak láthatónak kell lennie a felhasználó számára.

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 és OutputData adatátvitelhez

A WorkManager támogatja az adatátvitelt a Worker-ek között InputData és OutputData segítségével. Az InputData a WorkRequest felépítése során jön létre a Data.Builder segítségével, és az inputData-n keresztül kerül a Worker-be. A végrehajtás után a Worker OutputData-t hoz létre a workDataOf vagy a Data.Builder segítségével, és a Result.success(outputData) értékkel együtt adja vissza. A lánc következő Worker-e az előző outputData-ját kapja meg inputData-ként. Az adatok kulcs-érték formátumban tárolódnak, alapvető típusok támogatásával: String, Int, Long, Boolean, Double. A Data maximális mérete 10 KB.

A gyakorlatban sok projekt WorkManager-t használ egyetlen háttérfeladat-ütemezőként. A Google azt ajánlja, hogy az összes meglévő JobService-t migrálják WorkManager-re, különösen azokban az alkalmazásokban, amelyek Android 4.4-et (API 19) és alacsonyabb verziókat támogatnak, ahol a JobScheduler nem érhető el, és a WorkManager tartalék mechanizmust használ az AlarmManager és BroadcastReceiver segítségével. Teszteléshez a WorkManager TestListenableWorkerBuilder-t és TestWorkerBuilder-t biztosít, amelyek lehetővé teszik a Worker-ek JUnit tesztekben történő tesztelését valódi ütemező nélkül.

A WorkManager teszteléséhez használja az AndroidX Test TestListenableWorkerBuilder-ját, amely lehetővé teszi a Worker elkülönített környezetben történő futtatását és a visszaadott Result ellenőrzését. A könyvtár teljes JUnit és Robolectric támogatást nyújt a moduláris teszteléshez valódi ütemező nélkül. Összességében a WorkManager az esetek 80%-ában alkalmas, ahol korábban Service-t vagy JobScheduler-t használtak.

Gyakran ismételt kérdések

Garantálja-e a WorkManager a feladat végrehajtását az eszköz újraindítása után?

Igen, a WorkManager garantálja a végrehajtást még újraindítás után is. A könyvtár az összes befejezetlen feladatot elmenti a Room-adatbázisba, és visszaállítja őket a BroadcastReceiver segítségével, amely a rendszer betöltése után aktiválódik.

Mi a különbség a Worker, a CoroutineWorker és az RxWorker között?

Worker háttérszálon működik kotlin-korutin vagy RxJava támogatás nélkül. CoroutineWorker Kotlin-korutinokat használ suspend függvényekkel és a korutin scope-on keresztüli megszakítással. RxWorker Observable-lel és Single-lel dolgozik, reaktív láncokhoz alkalmas.

Hogyan szakíthatok meg egy feladatot a WorkManager-ben?

Megszakításhoz használja a workManager.cancelWorkById(id) vagy a workManager.cancelAllWorkByTag(“tag”) parancsot. A könyvtár a cancelUniqueWork(“name”) metódust is biztosítja a megadott nevű egyedi feladatok megszakításához.

Mi a minimális időköz a PeriodicWorkRequest esetén?

A PeriodicWorkRequest minimális időköze 15 perc. Ezt a korlátozást a Google állította be a túlzott akkumulátorfogyasztás megelőzése érdekében. Ha a feladatot gyakrabban kell végrehajtani, használjon Foreground Service-t vagy Handlert időzítővel.

Támogatja-e a WorkManager az Android 4.4-et és az alacsonyabb verziókat?

Igen, a WorkManager támogatja az API 14+-t. A JobScheduler nélküli eszközökön (API 21 alatt) a könyvtár az AlarmManager és a BroadcastReceiver kombinációját használja a feladatok ütemezésére. Ez teszi a WorkManager-t univerzális megoldássá a háttérfeladatokhoz.

Összegzés

  • WorkManager — egy modern Jetpack-könyvtár háttérfeladatokhoz garantált végrehajtással az Android összes verzióján.
  • Három alaposztály — Worker, WorkRequest és WorkManager — lefedi az összes ütemezési és végrehajtási forgatókönyvet.
  • Két kéréstípus — OneTimeWorkRequest és PeriodicWorkRequest — egyszeri és ismétlődő feladatokhoz.
  • Korlátozások (hálózat, akkumulátor, tárhely) védik a feladatot a kedvezőtlen körülmények közötti végrehajtástól.
  • Feladatkötések biztosítják a Worker-ek egymás utáni végrehajtását eredményátadással.
  • CoroutineWorker és RxWorker támogatják az aszinkron programozást korutinokon és RxJava-n keresztül.
  • WorkManager felváltja a JobScheduler-t, a Service-t és az AlarmManager-t a legtöbb háttérfeladat-forgatókönyvben.

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is