WorkManager — nedir, API ve görev planlama

Yazar: IT Sectr Yayınlanma: 2026-03-27 Okuma süresi: 8 dk

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 sürümünden bağımsız olarak garantili yürütme ile arka plan görevleri için bir Jetpack kütüphanesidir.
  • Worker, kütüphanenin ayrı bir iş parçacığında yürüttüğü arka plan görev mantığını tanımlamak için temel sınıftır.
  • WorkRequest, bir kerelik (OneTimeWorkRequest) ve periyodik (PeriodicWorkRequest, minimum 15 dakika aralıklı) olabilir.
  • Görev zincirleri, birden fazla Worker'ın sıralı veya paralel yürütülmesine olanak tanır.
  • Kısıtlamalar, başlatma koşullarını tanımlar: pil şarjı, ağ bağlantısı, depolama durumu.

WorkManager nedir?

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.

LiveData ile durum izleme

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.

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

WorkManager nasıl çalışır?

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

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.

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

WorkManager ile zamanlama

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.

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

WorkManager.getInstance(context)
    .enqueue(syncRequest)

WorkRequest türleri

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

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

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.

ParametreOneTimeWorkRequestPeriodicWorkRequest
Sıklıkbir kereliktekrarlayan (min. 15 dk)
Sayı1 yürütmeiptal edilene kadar
GecikmesetInitialDelaysetInitialDelay
Zincirlerdesteklerhayır
Kullanımindirme, senkronizasyonizleme, yoklama

Kısıtlamaları ayarlama ve görev zincirleri

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.

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

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

JobScheduler'dan WorkManager'a geçiş

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.

Benzersiz görevler için UniqueWork

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.

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

İlerleme ve ara sonuç yönetimi

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.

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

Veri aktarımı için InputData ve OutputData

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

WorkManager, cihaz yeniden başlatmasından sonra görev yürütmeyi garanti eder mi?

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, CoroutineWorker ve RxWorker arasındaki fark nedir?

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.

WorkManager'da bir görev nasıl iptal edilir?

İ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 nedir?

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.

WorkManager, Android 4.4 ve altını destekler mi?

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

  • WorkManager, tüm Android sürümlerinde garantili yürütme ile arka plan görevleri için modern bir Jetpack kütüphanesidir.
  • Üç temel sınıf — Worker, WorkRequest ve WorkManager — tüm zamanlama ve yürütme senaryolarını kapsar.
  • İki talep türü — OneTimeWorkRequest ve PeriodicWorkRequest — bir kerelik ve tekrarlayan görevler için.
  • Kısıtlamalar (ağ, pil, depolama), görevi elverişsiz koşullarda yürütülmekten korur.
  • Görev zincirleri, sonuç aktarımıyla Worker'ların sıralı yürütülmesini sağlar.
  • CoroutineWorker ve RxWorker, coroutine'ler ve RxJava aracılığıyla asenkron programlamayı destekler.
  • WorkManager, çoğu arka plan görev senaryosunda JobScheduler, Service ve AlarmManager'ın yerini alır.

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.

Projeyi tartış

Ayrıca okuyun