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 — 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.
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.
WorkManager.getInstance(context)
.getWorkInfoByIdLiveData(syncRequest.id)
.observe(viewLifecycleOwner) { workInfo ->
when (workInfo.state) {
WorkInfo.State.SUCCEEDED ->
showSuccess()
WorkInfo.State.FAILED ->
showError(workInfo.outputData)
else ->
showProgress()
}
}
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 — 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.
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 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.
val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
.setInitialDelay(15, TimeUnit.MINUTES)
.addTag("sync")
.build()
WorkManager.getInstance(context)
.enqueue(syncRequest)
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 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 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éter | OneTimeWorkRequest | PeriodicWorkRequest |
|---|---|---|
| Gyakoriság | egyszeri | ismétlődő (min. 15 perc) |
| Mennyiség | 1 végrehajtás | törlésig |
| Késleltetés | setInitialDelay | setInitialDelay |
| Kötések | támogatja | nem |
| Használat | betöltés, szinkronizálás | monitoring, polling |
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.
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.
WorkManager.getInstance(context)
.beginWith(compressWorker)
.then(uploadWorker)
.then(cleanupWorker)
.enqueue()
// compress -> upload -> cleanup egymás után
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.
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.
WorkManager.getInstance(context)
.enqueueUniqueWork(
"sync_data",
ExistingWorkPolicy.KEEP,
syncRequest
)
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.
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()
}
}
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
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.
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.
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.
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.
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
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.
Olvassa el is