WorkManager och bakgrundsjobb
Schemalägg garanterat bakgrundsarbete med WorkManager. Använd OneTimeWorkRequest, PeriodicWorkRequest, begränsningar, dataöverföring och kedjning av jobb.
WorkManager och bakgrundsjobb är en gratis lektion i Android Academy på CoddyKit. Detta är lektion 5 av 6. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Android Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Android Academy innehåller totalt 6 lektioner.
Bakgrundsarbete i Android
Android begränsar bakgrundsarbete kraftigt för att spara batteri. Innan WorkManager använde utvecklare:
- AsyncTask (föråldrat)
- AlarmManager (inte tillförlitligt efter omstarter eller i Doze-läge)
- JobScheduler (komplext API)
- Services (kan avslutas och saknar återförsök)
WorkManager är den rekommenderade lösningen för uppskjutet bakgrundsarbete som garanterat ska utföras.
Vad är WorkManager?
WorkManager garanterar att arbetet körs även om appen har avslutats eller enheten startas om. Det:
- bevarar arbete efter omstarter
- försöker automatiskt igen vid fel
- stöder villkor (endast Wi-Fi, endast under laddning och så vidare)
- fungerar på API 14+
- integreras med Kotlin Coroutines via
CoroutineWorker
Konfiguration
Lägg till WorkManager i app/build.gradle:
dependencies {
implementation 'androidx.work:work-runtime-ktx:2.9.0'
}Skapa en Worker
Utöka CoroutineWorker och implementera doWork(). Returnera Result.success(), Result.failure() eller Result.retry():
class SyncWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
return try {
// This runs on a background coroutine
val repo = UserRepository(applicationContext)
repo.syncFromNetwork()
Result.success()
} catch (e: Exception) {
if (runAttemptCount < 3) Result.retry()
else Result.failure()
}
}
}OneTimeWorkRequest
Schemalägg en engångsuppgift och lägg den i kön:
val syncWork = OneTimeWorkRequestBuilder<SyncWorker>()
.setInitialDelay(10, TimeUnit.MINUTES) // optional delay
.build()
WorkManager.getInstance(context).enqueue(syncWork)
// With a unique name (prevents duplicates):
WorkManager.getInstance(context).enqueueUniqueWork(
"sync_work",
ExistingWorkPolicy.KEEP, // don't enqueue if already pending
syncWork
)PeriodicWorkRequest
Schemalägg upprepade uppgifter. Det kortaste intervallet är 15 minuter:
val periodicSync = PeriodicWorkRequestBuilder<SyncWorker>(
repeatInterval = 1, TimeUnit.HOURS
).build()
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
"hourly_sync",
ExistingPeriodicWorkPolicy.KEEP,
periodicSync
)Villkor
Kör arbetet endast när villkoren är uppfyllda — batteriet får inte vara lågt, Wi-Fi måste vara anslutet och så vidare:
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED) // WiFi only
.setRequiresBatteryNotLow(true)
.setRequiresCharging(false)
.build()
val work = OneTimeWorkRequestBuilder<SyncWorker>()
.setConstraints(constraints)
.build()
WorkManager.getInstance(context).enqueue(work)Indata och utdata
Skicka data till och från en Worker med Data-objekt:
// Enqueue with input data:
val inputData = workDataOf("user_id" to 42)
val work = OneTimeWorkRequestBuilder<SyncWorker>()
.setInputData(inputData)
.build()
// Inside the Worker:
class SyncWorker(...) : CoroutineWorker(...) {
override suspend fun doWork(): Result {
val userId = inputData.getInt("user_id", -1)
// Pass output data back:
val output = workDataOf("synced_count" to 10)
return Result.success(output)
}
}Observera arbetsstatus
Observera arbetets förlopp med getWorkInfoByIdLiveData:
val workRequest = OneTimeWorkRequestBuilder<SyncWorker>().build()
WorkManager.getInstance(this).enqueue(workRequest)
WorkManager.getInstance(this)
.getWorkInfoByIdLiveData(workRequest.id)
.observe(this) { info ->
when (info?.state) {
WorkInfo.State.RUNNING -> binding.tvStatus.text = "Syncing..."
WorkInfo.State.SUCCEEDED -> binding.tvStatus.text = "Done!"
WorkInfo.State.FAILED -> binding.tvStatus.text = "Failed"
else -> {}
}
}Kedja arbete
Kör uppgifter sekventiellt eller parallellt med arbetskedjor:
val downloadWork = OneTimeWorkRequestBuilder<DownloadWorker>().build()
val processWork = OneTimeWorkRequestBuilder<ProcessWorker>().build()
val uploadWork = OneTimeWorkRequestBuilder<UploadWorker>().build()
// Sequential: download → process → upload
WorkManager.getInstance(context)
.beginWith(downloadWork)
.then(processWork)
.then(uploadWork)
.enqueue()
// Parallel then merge:
WorkManager.getInstance(context)
.beginWith(listOf(downloadWork, processWork)) // both run in parallel
.then(uploadWork) // runs after both finish
.enqueue()WorkManager jämfört med alternativ
När ska Ni använda vad?
- WorkManager — uppskjutet, garanterat och villkorsstyrt arbete. Passar bäst för synkronisering, uppladdningar och rensning.
- Coroutines / ViewModel — arbete som är kopplat till att appen är öppen. Avslutas när appen stängs.
- AlarmManager — alarm vid en exakt tidpunkt (kalenderpåminnelser). Kräver noggrann batterihantering.
- Foreground Service — långvariga uppgifter som användaren känner till (musikuppspelning, navigering).
Snabbkontroll
Vilket är det kortaste upprepningsintervallet för en PeriodicWorkRequest?
Sammanfattning: WorkManager
WorkManager är rätt verktyg för garanterat bakgrundsarbete:
- Utöka
CoroutineWorkeroch implementeradoWork() - Returnera
Result.success(),.failure()eller.retry() - Använd
OneTimeWorkRequestför enstaka körningar ochPeriodicWorkRequestför återkommande körningar - Lägg till
Constraintsför endast Wi-Fi, batterivillkor och så vidare - Skicka data med
workDataOf() - Kedja uppgifter med
beginWith().then().enqueue()
Nästa steg: Material Design-komponenter för användargränssnitt med tilltalande utseende.
Lär dig Kotlin med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 36
- Lektioner
- 152
Vanliga frågor
Är lektionen ”WorkManager och bakgrundsjobb” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Android Academy, inklusive ”WorkManager och bakgrundsjobb”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Android Academy innehåller totalt 6 lektioner.
Vad lär jag mig i ”WorkManager och bakgrundsjobb”?
Schemalägg garanterat bakgrundsarbete med WorkManager. Använd OneTimeWorkRequest, PeriodicWorkRequest, begränsningar, dataöverföring och kedjning av jobb. Ni övar på Android Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Android Academy?
Du behöver inga förkunskaper. Utbildningen i Android Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 5 av 6.
Hur lång tid tar lektionen ”WorkManager och bakgrundsjobb”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Android Academy-lektionen?
Ja. Varje Android Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Retrofit och REST-API:er
- Ladda bilder med Coil
- Felhantering och UX
- Pushnotiser
- WorkManager och bakgrundsjobb
- Publicera i Play Store