WorkManager — är ett Android Jetpack-bibliotek utformat för att utföra fördröjda och bakgrundsuppgifter med exekveringsgaranti. Till skillnad från Service eller JobScheduler tar WorkManager över hanteringen av uppgiftens livscykel: den startar om vid fel, anpassar sig till Android-versionen och tar hänsyn till enhetens begränsningar. Enligt Android Developers, 2026 är WorkManager den föredragna lösningen för de flesta bakgrundsoperationer inom modern Android-utveckling.
Huvudpunkter
WorkManager — är en del av Android Jetpack, ett bibliotek för att hantera bakgrundsuppgifter som måste utföras garanterat, oavsett om appen är i förgrunden eller har stängts av användaren. Biblioteket stöder API 14+ och väljer automatiskt lämplig exekveringsmekanism: JobScheduler på Android 5+, BroadcastReceiver + AlarmManager på äldre versioner.
Nyckelfunktionen i WorkManager är exekveringsgarantin. Om en uppgift inte slutfördes på grund av omstart av enheten, stopp av appen eller ett fel, kommer WorkManager att starta om den vid första tillfället. Detta gör biblioteket till ett idealiskt val för uppgifter som är kritiska att utföra: skicka analysdata, synkronisera databas, ladda upp loggar.
Till skillnad från Background Service kräver WorkManager ingen tråd- och livscykelhantering. Biblioteket skapar själv en trådpool, hanterar Doze Mode, tar hänsyn till Android-versionen och tillhandahåller ett enhetligt API oavsett API-nivå. Arbete med coroutines och RxJava stöds via CoroutineWorker respektive RxWorker.
WorkManager har inbyggt stöd för LiveData för att spåra status för uppgifter. Metoden getWorkInfoByIdLiveData returnerar LiveData<WorkInfo> som uppdateras vid varje statusändring: ENQUEUED, RUNNING, SUCCEEDED, FAILED, CANCELLED. Detta gör att UI-komponenter kan reagera på ändringar utan manuell avfrågning av schemaläggaren och utan minnesläckor tack vare Lifecycle-aware-komponenter.
WorkManager.getInstance(context)
.getWorkInfoByIdLiveData(syncRequest.id)
.observe(viewLifecycleOwner) { workInfo ->
when (workInfo.state) {
WorkInfo.State.SUCCEEDED ->
showSuccess()
WorkInfo.State.FAILED ->
showError(workInfo.outputData)
else ->
showProgress()
}
}
Arkitekturen i WorkManager är uppbyggd kring tre basklasser: Worker, WorkRequest och WorkManager. Worker innehåller uppgiftslogiken, WorkRequest beskriver exekveringsparametrarna och WorkManager hanterar kön och schemaläggning. Biblioteket använder en intern Room-databas för att lagra status för alla uppgifter.
Worker — är en abstrakt klass med en enda metod doWork som anropas i en bakgrundstråd. Metoden returnerar ListenableWorker.Result — SUCCESS, FAILURE eller RETRY. WorkRequest kopplar Worker till parametrar: timeout, tagg, initial fördröjning och begränsningar.
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 schemalägger uppgifter enhetligt oavsett Android-version. När enqueue anropas sparar biblioteket uppgiften i Room, utvärderar aktuella förhållanden och väljer optimal starttid. Under huven kan JobScheduler, AlarmManager eller en egen schemaläggare användas — utvecklaren behöver inte tänka på det.
val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
.setInitialDelay(15, TimeUnit.MINUTES)
.addTag("sync")
.build()
WorkManager.getInstance(context)
.enqueue(syncRequest)
WorkManager stöder två typer av exekveringsförfrågningar: engångs- och periodiska. Valet av typ beror på scenariot: uppgiften ska utföras en gång eller upprepas med ett visst intervall.
OneTimeWorkRequest är avsedd för uppgifter som ska utföras en gång. Det kan vara att skicka en logg, synkronisera data efter auktorisering, ladda konfiguration vid första start. Fördröjning ställs in via setInitialDelay och begränsningar via setConstraints.
PeriodicWorkRequest passar för återkommande uppgifter med ett minimiintervall på 15 minuter. Biblioteket garanterar att intervallet mellan körningar inte blir kortare än angivet, men kan vara längre på grund av enhetsbegränsningar. För uppgifter med frekvens mindre än 15 minuter, använd Handler eller Timer i en Foreground Service.
| Parameter | OneTimeWorkRequest | PeriodicWorkRequest |
|---|---|---|
| Frekvens | engångs | återkommande (min. 15 min) |
| Antal | 1 exekvering | tills avbrytning |
| Fördröjning | setInitialDelay | setInitialDelay |
| Kedjor | stöder | nej |
| Användning | laddning, synkronisering | övervakning, polling |
Begränsningar (constraints) i WorkManager gör det möjligt att ange villkor under vilka en uppgift kan startas: nätverksanslutning (NetworkType), batterinivå (batteryNotLow), lagringsstatus (StorageNotLow) och viloläge (DeviceIdle). Uppgiften startar inte förrän alla begränsningar är uppfyllda.
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresCharging(true)
.setRequiresBatteryNotLow(true)
.build()
val request = OneTimeWorkRequestBuilder<ImageUploadWorker>()
.setConstraints(constraints)
.build()
Kedjor (chaining) gör det möjligt att organisera sekventiell eller parallell exekvering av uppgifter. beginWith startar en kedja, then lägger till nästa Worker som körs efter att den föregående har slutförts framgångsrikt. För parallell exekvering, använd workManager.enqueue(listOf(request1, request2)).
WorkManager.getInstance(context)
.beginWith(compressWorker)
.then(uploadWorker)
.then(cleanupWorker)
.enqueue()
// compress -> upload -> cleanup sekventiellt
JobScheduler introducerades i Android 5 (API 21) som en systemtjänst för schemaläggning av bakgrundsuppgifter. WorkManager kom som ersättning med ett plattformsoberoende API, automatisk migrering och ytterligare funktioner: kedjor, exekveringsgaranti, taggar, statusövervakning via LiveData.
Vid migrering från JobScheduler till WorkManager måste JobService konverteras till Worker, JobInfo ersättas med WorkRequest och Context.getSystemService med WorkManager API. WorkManager löser automatiskt kompatibilitetsproblem och hanterar Doze Mode mer korrekt än en manuell JobScheduler-implementering. Migreringssteg: 1) skapa en Worker-klass, 2) bygg en WorkRequest med samma villkor, 3) ta bort JobService och JobInfo från koden och manifestet.
WorkManager stöder konceptet med unika uppgifter via ExistingWorkPolicy. Om en uppgift med det angivna namnet redan finns, bestämmer policyn beteendet: KEEP (skapa inte en ny), REPLACE (ersätt den befintliga), APPEND (lägg till i slutet av kedjan) och APPEND_OR_REPLACE. UniqueWorkRequest är praktiskt för uppgifter som inte bör dupliceras: databas-synkronisering, konfigurationsladdning, skicka ett analyspaket.
WorkManager.getInstance(context)
.enqueueUniqueWork(
"sync_data",
ExistingWorkPolicy.KEEP,
syncRequest
)
CoroutineWorker stöder setProgress-mekanismen som gör det möjligt att skicka delresultat från en uppgift. Detta är användbart för långa operationer: ladda en stor fil, batch-bearbetning av bilder, databasmigrering. UI:t kan prenumerera på uppdateringar via getWorkInfosByTagLiveData och visa framsteg i realtid. Även ForegroundInfo-metoden finns tillgänglig för att starta Worker som en Foreground Service med en notifikation om uppgiften måste vara synlig för användaren.
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()
}
}
WorkManager stöder dataöverföring mellan Workers via InputData och OutputData. InputData skapas vid byggandet av WorkRequest via Data.Builder och skickas till Worker via inputData. Efter exekvering skapar Worker OutputData via workDataOf eller Data.Builder och returnerar den tillsammans med Result.success(outputData). Nästa Worker i kedjan tar emot den föregåendes outputData som sin inputData. Data lagras i nyckel-värde-format med stöd för grundläggande typer: String, Int, Long, Boolean, Double. Den maximala storleken för Data är 10 KB.
I praktiken använder många projekt WorkManager som enda schemaläggare för bakgrundsuppgifter. Google rekommenderar att alla befintliga JobService migreras till WorkManager, särskilt i appar som stöder Android 4.4 (API 19) och lägre, där JobScheduler inte är tillgängligt och WorkManager använder en reservmekanism via AlarmManager och BroadcastReceiver. För testning tillhandahåller WorkManager TestListenableWorkerBuilder och TestWorkerBuilder, som gör det möjligt att testa Workers i JUnit-tester utan en riktig schemaläggare.
För att testa WorkManager, använd TestListenableWorkerBuilder från AndroidX Test, som gör att du kan köra Worker i en isolerad miljö och kontrollera det returnerade Resultatet. Biblioteket har fullt stöd för JUnit och Robolectric för modulära tester utan en verklig schemaläggare. Sammantaget är WorkManager lämplig för 80 % av uppgifterna där Service eller JobScheduler tidigare användes.
Vanliga frågor
Ja, WorkManager garanterar exekvering även efter omstart. Biblioteket sparar alla ofullständiga uppgifter i Room-databasen och återställer dem via en BroadcastReceiver som utlöses efter systemstart.
Worker arbetar i en bakgrundstråd utan stöd för coroutines eller RxJava. CoroutineWorker använder Kotlin-coroutines med stöd för suspend-funktioner och avbrytning via coroutine-scope. RxWorker arbetar med Observable och Single, lämplig för reaktiva kedjor.
För avbrytning, använd workManager.cancelWorkById(id) eller workManager.cancelAllWorkByTag(“tag”). Biblioteket tillhandahåller också metoden cancelUniqueWork(“name”) för att avbryta unika uppgifter med angivet namn.
Minimiintervallet för PeriodicWorkRequest är 15 minuter. Denna begränsning har satts av Google för att förhindra överdriven batteriförbrukning. Om uppgiften måste utföras oftare, använd en Foreground Service eller Handler med en timer.
Ja, WorkManager stöder API 14+. På enheter utan JobScheduler (lägre än API 21) använder biblioteket en kombination av AlarmManager och BroadcastReceiver för schemaläggning av uppgifter. Detta gör WorkManager till en universell lösning för bakgrundsuppgifter.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också