WorkManager — vad är det, API och uppgiftsschemaläggning

Författare: IT Sectr Publicerad: 2026-03-27 Lästid: 8 min

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 ett Jetpack-bibliotek för bakgrundsuppgifter med garanterad exekvering, oavsett Android-version.
  • Worker — basklassen för att definiera logiken för en bakgrundsuppgift, som biblioteket utför i en separat tråd.
  • WorkRequest kan vara engångs- (OneTimeWorkRequest) eller periodisk (PeriodicWorkRequest) med ett minimiintervall på 15 minuter.
  • Uppgiftskedjor gör det möjligt att ordna sekventiell eller parallell exekvering av flera Workers.
  • Begränsningar (constraints) anger startvillkoren: batterinivå, nätverksanslutning, lagringsstatus.

Vad är WorkManager?

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.

Statusövervakning via LiveData

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.

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

Hur fungerar WorkManager?

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 och WorkRequest

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.

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

Schemaläggning via WorkManager

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.

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

WorkManager.getInstance(context)
    .enqueue(syncRequest)

Typer av WorkRequest

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

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

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.

ParameterOneTimeWorkRequestPeriodicWorkRequest
Frekvensengångsåterkommande (min. 15 min)
Antal1 exekveringtills avbrytning
FördröjningsetInitialDelaysetInitialDelay
Kedjorstödernej
Användningladdning, synkroniseringövervakning, polling

Ställa in begränsningar och uppgiftskedjor

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.

kotlin
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)).

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

Migrering från JobScheduler till WorkManager

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.

UniqueWork för unika uppgifter

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.

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

Hantera framsteg och delresultat

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.

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 och OutputData för dataöverföring

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

Garantierar WorkManager exekvering av en uppgift efter omstart av enheten?

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.

Vad är skillnaden mellan Worker, CoroutineWorker och RxWorker?

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.

Hur avbryter jag en uppgift i WorkManager?

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.

Vad är minimiintervallet för PeriodicWorkRequest?

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.

Stöder WorkManager Android 4.4 och lägre?

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

  • WorkManager — är ett modernt Jetpack-bibliotek för bakgrundsuppgifter med garanterad exekvering på alla Android-versioner.
  • Tre basklasser — Worker, WorkRequest och WorkManager — täcker alla schemaläggnings- och exekveringsscenarier.
  • Två typer av förfrågningar — OneTimeWorkRequest och PeriodicWorkRequest — för engångs- och återkommande uppgifter.
  • Begränsningar (nätverk, batteri, lagring) skyddar uppgiften från exekvering under ogynnsamma förhållanden.
  • Uppgiftskedjor säkerställer sekventiell exekvering av Workers med resultatöverföring.
  • CoroutineWorker och RxWorker stöder asynkron programmering via coroutines och RxJava.
  • WorkManager ersätter JobScheduler, Service och AlarmManager för de flesta bakgrundsuppgiftsscenarier.

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.

Diskutera projektet

Läs också