WorkManager, ertelenmiş ve arka plan görevlerini garantili yürütme ile gerçekleştirmek için tasarlanmış bir Android Jetpack kütüphanesidir. Service veya JobScheduler'ın aksine, WorkManager görev yaşam döngüsünü yönetir: başarısızlık durumunda yeniden başlatır, Android sürümüne uyum sağlar ve cihaz kısıtlamalarını dikkate alır. Android Developers, 2026'ya göre WorkManager, modern Android geliştirmede çoğu arka plan işlemi için tercih edilen çözümdür.
Önemli Noktalar
WorkManager, Android Jetpack'in bir parçasıdır, uygulama ön planda olsun veya kullanıcı tarafından kapatılmış olsun, garantili bir şekilde yürütülmesi gereken arka plan görevlerini yönetmek için bir kütüphanedir. Kütüphane API 14+'ı destekler ve uygun yürütme mekanizmasını otomatik olarak seçer: Android 5+'da JobScheduler, eski sürümlerde BroadcastReceiver + AlarmManager.
WorkManager'in temel özelliği garantili yürütmedir. Bir görev, cihaz yeniden başlatması, uygulama kapatılması veya çökme nedeniyle tamamlanmadıysa, WorkManager onu ilk fırsatta yeniden başlatacaktır. Bu, kütüphaneyi yürütme açısından kritik görevler için ideal bir seçim haline getirir: analitik gönderme, veritabanı senkronizasyonu, günlük yükleme.
Background Service'in aksine, WorkManager iş parçacığı ve yaşam döngüsü yönetimi gerektirmez. Kütüphane kendisi bir iş parçacığı havuzu oluşturur, Doze Modu'nu yönetir, Android sürümünü dikkate alır ve API seviyesinden bağımsız olarak birleşik bir API sağlar. Coroutine ve RxJava desteği sırasıyla CoroutineWorker ve RxWorker aracılığıyla kullanılabilir.
WorkManager, görev durumlarını izlemek için yerleşik LiveData desteği sağlar. getWorkInfoByIdLiveData yöntemi, her durum değişikliğinde güncellenen LiveData<WorkInfo> döndürür: ENQUEUED, RUNNING, SUCCEEDED, FAILED, CANCELLED. Bu, UI bileşenlerinin, Lifecycle-aware bileşenler sayesinde zamanlayıcıyı manuel olarak yoklamadan ve bellek sızıntısı olmadan değişikliklere tepki vermesine olanak tanır.
WorkManager.getInstance(context)
.getWorkInfoByIdLiveData(syncRequest.id)
.observe(viewLifecycleOwner) { workInfo ->
when (workInfo.state) {
WorkInfo.State.SUCCEEDED ->
showSuccess()
WorkInfo.State.FAILED ->
showError(workInfo.outputData)
else ->
showProgress()
}
}
WorkManager'in mimarisi üç temel sınıf etrafında inşa edilmiştir: Worker, WorkRequest ve WorkManager. Worker görev mantığını içerir, WorkRequest yürütme parametrelerini tanımlar ve WorkManager kuyruğu ve zamanlamayı yönetir. Kütüphane, tüm görevlerin durumunu depolamak için dahili bir Room veritabanı kullanır.
Worker, arka plan iş parçacığında çağrılan tek bir doWork yöntemine sahip soyut bir sınıftır. Yöntem ListenableWorker.Result — SUCCESS, FAILURE veya RETRY döndürür. WorkRequest, Worker'ı parametrelerle (zaman aşımı, etiket, başlangıç gecikmesi ve kısıtlamalar) ilişkilendirir.
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, Android sürümünden bağımsız olarak görevleri tek tip şekilde zamanlar. enqueue çağrıldığında, kütüphane görevi Room'a kaydeder, mevcut koşulları değerlendirir ve en uygun yürütme zamanını seçer. Perde arkasında JobScheduler, AlarmManager veya kendi zamanlayıcısını kullanabilir — geliştiricinin bunun için endişelenmesine gerek yoktur.
val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
.setInitialDelay(15, TimeUnit.MINUTES)
.addTag("sync")
.build()
WorkManager.getInstance(context)
.enqueue(syncRequest)
WorkManager iki tür yürütme talebini destekler: bir kerelik ve periyodik. Tür seçimi senaryoya bağlıdır: görev bir kez mi çalışmalı yoksa belirli bir aralıkta mı tekrarlanmalı.
OneTimeWorkRequest, bir kez yürütülmesi gereken görevler için tasarlanmıştır. Bu, günlük gönderme, yetkilendirme sonrası veri senkronizasyonu, ilk başlatmada yapılandırma indirme olabilir. Gecikme setInitialDelay ile, kısıtlamalar ise setConstraints ile ayarlanır.
PeriodicWorkRequest, minimum 15 dakika aralıklı tekrarlayan görevler için uygundur. Kütüphane, çalıştırmalar arasındaki aralığın belirtilenden daha kısa olmayacağını garanti eder, ancak cihaz kısıtlamaları nedeniyle daha uzun olabilir. 15 dakikadan daha sık görevler için Foreground Service'de Handler veya Timer kullanın.
| Parametre | OneTimeWorkRequest | PeriodicWorkRequest |
|---|---|---|
| Sıklık | bir kerelik | tekrarlayan (min. 15 dk) |
| Sayı | 1 yürütme | iptal edilene kadar |
| Gecikme | setInitialDelay | setInitialDelay |
| Zincirler | destekler | hayır |
| Kullanım | indirme, senkronizasyon | izleme, yoklama |
WorkManager'daki kısıtlamalar, bir görevin başlatılabileceği koşulları belirlemenize olanak tanır: ağ bağlantısı (NetworkType), pil seviyesi (batteryNotLow), depolama durumu (StorageNotLow) ve boşta kalma modu (DeviceIdle). Tüm kısıtlamalar karşılanana kadar görev başlatılmaz.
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresCharging(true)
.setRequiresBatteryNotLow(true)
.build()
val request = OneTimeWorkRequestBuilder<ImageUploadWorker>()
.setConstraints(constraints)
.build()
Zincirler, görevlerin sıralı veya paralel yürütülmesini düzenlemenize olanak tanır. beginWith bir zincir başlatır, then bir öncekinin başarıyla tamamlanmasından sonra yürütülecek bir sonraki Worker'ı ekler. Paralel yürütme için workManager.enqueue(listOf(request1, request2)) kullanın.
WorkManager.getInstance(context)
.beginWith(compressWorker)
.then(uploadWorker)
.then(cleanupWorker)
.enqueue()
// compress -> upload -> cleanup sırayla
JobScheduler, Android 5'te (API 21) arka plan görevlerini zamanlamak için bir sistem hizmeti olarak tanıtıldı. WorkManager, otomatik geçiş ve ek yeteneklerle (zincirler, yürütme garantisi, etiketler, LiveData ile durum izleme) çapraz platform bir API sunarak onun yerini aldı.
JobScheduler'dan WorkManager'a geçiş yaparken, JobService'i Worker'a dönüştürmeniz, JobInfo'yu WorkRequest ile ve Context.getSystemService'i WorkManager API'si ile değiştirmeniz gerekir. WorkManager uyumluluk sorunlarını otomatik olarak yönetir ve Doze Modu'nu manuel JobScheduler uygulamasından daha doğru şekilde işler. Geçiş adımları: 1) Worker sınıfı oluşturun, 2) aynı koşullarla bir WorkRequest oluşturun, 3) kod ve manifest dosyasından JobService ve JobInfo'yu kaldırın.
WorkManager, ExistingWorkPolicy aracılığıyla benzersiz görevler kavramını destekler. Belirtilen ada sahip bir görev zaten mevcutsa, politika davranışı belirler: KEEP (yeni oluşturma), REPLACE (mevcut olanı değiştir), APPEND (zincirin sonuna ekle) ve APPEND_OR_REPLACE. UniqueWorkRequest, tekrarlanmaması gereken görevler için kullanışlıdır: veritabanı senkronizasyonu, yapılandırma indirme, analitik toplu gönderme.
WorkManager.getInstance(context)
.enqueueUniqueWork(
"sync_data",
ExistingWorkPolicy.KEEP,
syncRequest
)
CoroutineWorker, ara yürütme sonuçlarını iletmeye olanak tanıyan setProgress mekanizmasını destekler. Bu, uzun süren işlemler için kullanışlıdır: büyük dosya indirme, toplu görüntü işleme, veritabanı geçişi. UI, getWorkInfosByTagLiveData aracılığıyla güncellemelere abone olabilir ve gerçek zamanlı ilerlemeyi görüntüleyebilir. Görevin kullanıcıya görünür olması gerekiyorsa, ForegroundInfo yöntemi, Worker'ı bir bildirimle Foreground Service olarak çalıştırmak için de kullanılabilir.
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, InputData ve OutputData aracılığıyla Worker'lar arasında veri aktarımını destekler. InputData, Data.Builder aracılığıyla WorkRequest oluşturma sırasında oluşturulur ve inputData aracılığıyla Worker'a iletilir. Yürütmeden sonra Worker, workDataOf veya Data.Builder aracılığıyla OutputData oluşturur ve Result.success(outputData) ile birlikte döndürür. Zincirdeki bir sonraki Worker, bir öncekinin outputData'sını kendi inputData'sı olarak alır. Veriler, temel türler (String, Int, Long, Boolean, Double) desteğiyle anahtar-değer biçiminde depolanır. Maksimum Data boyutu 10 KB'dir.
Pratikte, birçok proje WorkManager'ı tek arka plan görev zamanlayıcısı olarak kullanır. Google, özellikle JobScheduler'ın bulunmadığı ve WorkManager'in AlarmManager ve BroadcastReceiver aracılığıyla yedekleme mekanizması kullandığı Android 4.4 (API 19) ve altını destekleyen uygulamalarda, mevcut tüm JobService'leri WorkManager'a geçirmeyi önerir. Test için WorkManager, gerçek bir zamanlayıcı olmadan JUnit testlerinde Worker'ları test etmeye olanak tanıyan TestListenableWorkerBuilder ve TestWorkerBuilder sağlar.
WorkManager'i test etmek için, Worker'ları izole bir ortamda çalıştırmaya ve döndürülen Result'u doğrulamaya olanak tanıyan AndroidX Test'teki TestListenableWorkerBuilder'ı kullanın. Kütüphane, gerçek bir zamanlayıcı olmadan birim testleri için tam JUnit ve Robolectric desteği sağlar. Genel olarak WorkManager, daha önce Service veya JobScheduler'ın kullanıldığı görevlerin %80'i için uygundur.
Sıkça sorulan sorular
Evet, WorkManager yeniden başlatmadan sonra bile yürütmeyi garanti eder. Kütüphane, tamamlanmamış tüm görevleri bir Room veritabanında saklar ve sistem başlatıldıktan sonra tetiklenen BroadcastReceiver'ı kullanarak geri yükler.
Worker, coroutine veya RxJava desteği olmadan arka plan iş parçacığında çalışır. CoroutineWorker, suspend işlevleri ve coroutine kapsamı üzerinden iptal desteği ile Kotlin coroutine'lerini kullanır. RxWorker, Observable ve Single ile çalışır, reaktif zincirler için uygundur.
İptal etmek için workManager.cancelWorkById(id) veya workManager.cancelAllWorkByTag("tag") kullanın. Kütüphane ayrıca belirtilen ada sahip benzersiz görevleri iptal etmek için cancelUniqueWork("name") yöntemini de sağlar.
PeriodicWorkRequest için minimum aralık 15 dakikadır. Bu sınırlama, aşırı pil tüketimini önlemek için Google tarafından belirlenmiştir. Bir görevin daha sık çalıştırılması gerekiyorsa, Foreground Service veya zamanlayıcılı Handler kullanın.
Evet, WorkManager API 14+'ı destekler. JobScheduler'ı olmayan cihazlarda (API 21'in altında), kütüphane görev zamanlaması için AlarmManager ve BroadcastReceiver kombinasyonunu kullanır. Bu, WorkManager'ı arka plan görevleri için evrensel bir çözüm haline getirir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun