WorkManager — bu Android üçün Jetpack kitabxanasıdır, gecikmiş və fon tapşırıqlarını yerin yetirmə üçün nəzərdə tutulub. Service və ya JobScheduler-dən fərqli olaraq, WorkManager tapşırığın həyat dövriyyəsinin idarə edilməsini öz üzərinə götürür: uğursuzluq halında onu yenidən başladır, Android versiyasına uyğunlaşır və cihazın məhdudiyyətlərini nəzərə alır. Android Developers, 2026 məlumatlarına görə, WorkManager müasir Android inkişafında əksər fon əməliyyatları üçün üstünlük verilən həll yoludur.
Başlıca
WorkManager — Android Jetpack-in bir hissəsi, proqram ön planda olsa da, istifadəçi tərəfindən bağlansa da, zəmanətli yerin yetirilməli olan fon tapşırıqlarını idarə etmək üçün kitabxanadır. Kitabxana API 14+ dəstəkləyir və avtomatik olaraq uyğun icra mexanizmini seçir: Android 5+ üçün JobScheduler, köhnə versiyalar üçün BroadcastReceiver + AlarmManager.
WorkManager-in əsas xüsusiyyəti icra zəmanətidir. Tapşırıq cihazın yenidən başaldılması, proqramın dayandırılması və ya uğursuzluq səbəbindən tamamlanmayıbsa, WorkManager onu ilk fürsətdə yenidən başladır. Bu, kitabxananı icrası kritik olan tapşırıqlar üçün ideal seçim edir: analitika göndərilməsi, verilənlər bazasının sinxronlaşdırılması, faylların yüklənilməsi.
Background Service-dən fərqli olaraq, WorkManager ipliklərin və həyat dövriyyəsinin idarə edilməsini tələb etmir. Kitabxana özü iplik hovuzu yaradır, Doze Mode-u idarə edir, Android versiyasını nəzərə alır və API səviyyəsindən asılı olmayaraq vahid API təmin edir. CoroutineWorker və RxWorker vasitəsilə korutin və RxJava ilə iş dəstəklənir.
WorkManager tapşırıq vəziyyətlərini izləmək üçün LiveData üçün daxili dəstək təmin edir. getWorkInfoByIdLiveData metodu ENQUEUED, RUNNING, SUCCEEDED, FAILED, CANCELLED vəziyyətlərinin hər dəyişməsində yenilənən LiveData<WorkInfo> qaytarır. Bu, UI komponentlərinə planlayıcını əl ilə sorğulamadan və Lifecycle-aware komponentləri sayəsində yaddaş sızıntıları olmadan dəyişikliklərə reaksiya verməyə imkan verir.
WorkManager.getInstance(context)
.getWorkInfoByIdLiveData(syncRequest.id)
.observe(viewLifecycleOwner) { workInfo ->
when (workInfo.state) {
WorkInfo.State.SUCCEEDED ->
showSuccess()
WorkInfo.State.FAILED ->
showError(workInfo.outputData)
else ->
showProgress()
}
}
Arxitektura WorkManager üç əsas sinif ətrafında qurulub: Worker, WorkRequest və WorkManager. Worker tapşırıq məntiqini ehtiva edir, WorkRequest icra parametrlərini təsvir edir, WorkManager isə növbə və planlaşdırmanı idarə edir. Kitabxana bütün tapşırıqların vəziyyətini saxlamaq üçün daxili Room verilənlər bazasından istifadə edir.
Worker — fon iplikdə çağırılan tək doWork metodu olan abstrakt sinifdir. Metod ListenableWorker.Result — SUCCESS, FAILURE və ya RETRY qaytarır. WorkRequest Worker-i parametrlərlə əlaqələndirir: vaxt aşımı, teq, ilkin gecikmə və məhdudiyyətlər.
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 versiyasından asılı olmayaraq tapşırıqları vahid şəkildə planlaşdırır. enqueue çağırışı zamanı kitabxana tapşırığı Room-da saxlayır, cari şərtləri qiymətləndirir və optimal başlatma vaxtını seçir. Daxildə JobScheduler, AlarmManager və ya öz planlayıcısı istifadə oluna bilər — tərtibatçı bu barədə düşünmür.
val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
.setInitialDelay(15, TimeUnit.MINUTES)
.addTag("sync")
.build()
WorkManager.getInstance(context)
.enqueue(syncRequest)
WorkManager iki növ icra sorğusunu dəstəkləyir: birdəfəlik və dövri. Növün seçimi ssenaridən asılıdır: tapşırıq bir dəfə yerin yetirilməli və ya müəyyən fasilə ilə təkrarlanmalıdır.
OneTimeWorkRequest bir dəfə yerin yetirilməli tapşırıqlar üçün nəzərdə tutulub. Bu, log göndərmə, girişdən sonra verilənlərin sinxronlaşdırılması, ilk işə salınmada konfiqurasiyanın yüklənməsi ola bilər. Gecikmə setInitialDelay, məhdudiyyətlər isə setConstraints vasitəsilə təyin edilir.
PeriodicWorkRequest minimum 15 dəqiqə fasilə ilə təkrarlanan tapşırıqlar üçün uyğundur. Kitabxana işə salmalar arasındakı fasilənin göstəriləndən az olmayacağına zəmanət verir, lakin cihazın məhdudiyyətləri səbəbindən daha çox ola bilər. Tezliyi 15 dəqiqədən az olan tapşırıqlar üçün Foreground Service-də Handler və ya Timer istifadə edin.
| Parametr | OneTimeWorkRequest | PeriodicWorkRequest |
|---|---|---|
| Tezlik | birdəfəlik | təkrarlanan (min. 15 dəq) |
| Say | 1 icra | ləğv edilənə qədər |
| Gecikmə | setInitialDelay | setInitialDelay |
| Zəncirlər | dəstəklənir | yox |
| \u0130stifadə | yükləmə, sinxronizasiya | monitorinq, polling |
Məhdudiyyətlər (constraints) WorkManager-də tapşırığın başladıla biləcəyi şərtləri təyin etməyə imkan verir: şəbəkə qoşulması (NetworkType), batareya səviyyəsi (batteryNotLow), yaddaş vəziyyəti (StorageNotLow) və gözləmə rejimi (DeviceIdle). Bütün məhdudiyyətlər yerin yetirilməyincə tapşırıq başlamaz.
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresCharging(true)
.setRequiresBatteryNotLow(true)
.build()
val request = OneTimeWorkRequestBuilder<ImageUploadWorker>()
.setConstraints(constraints)
.build()
Zəncirlər (chaining) tapşırıqların ardıcıl və ya paralel yerin yetirilməsini təşkil etməyə imkan verir. beginWith zənciri başladır, then əvvəlki uğurla tamamlandıqdan sonra icra olunacaq növbəti Worker-i əlavə edir. Paralel icra üçün workManager.enqueue(listOf(request1, request2)) istifadə olunur.
WorkManager.getInstance(context)
.beginWith(compressWorker)
.then(uploadWorker)
.then(cleanupWorker)
.enqueue()
// compress → upload → cleanup ardıcıl
JobScheduler Android 5-də (API 21) fon tapşırıqlarını planlaşdırmaq üçün sistem xidməti kimi təqdim edilmişdir. WorkManager avtomatik miqrasiya və əlavə imkanlarla çarpaz platforma API təklif edərək onu əvəz etdi: zəncirlər, icra zəmanəti, teqlər, LiveData vasitəsilə vəziyyətin izlənilməsi.
JobScheduler-dən WorkManager-ə miqrasiya zamanı JobService-i Worker-ə çevirmək, JobInfo-nu WorkRequest ilə əvəz etmək, Context.getSystemService-i WorkManager API-si ilə əvəz etmək lazımdır. WorkManager uyğunluq problemlərini avtomatik həll edir və Doze Mode-u əl ilə JobScheduler tətbiqindən daha düzgün idarə edir. Miqrasiya addımları: 1) Worker sinfi yaradın, 2) eyni şərtlərlə WorkRequest qurun, 3) JobService və JobInfo-nu koddan və manifestdən silin.
WorkManager ExistingWorkPolicy vasitəsilə unikal tapşırıqlar konsepsiyasını dəstəkləyir. Göstərilən adlı tapşırıq artıq varsa, siyasət davranışı müəyyənləşdirir: KEEP (yenisini yaratma), REPLACE (mövcudu əvəz et), APPEND (zəncirin sonuna əlavə et) və APPEND_OR_REPLACE. UniqueWorkRequest təkrarlanmamalı olan tapşırıqlar üçün əlverişlidir: verilənlər bazasının sinxronlaşdırılması, konfiqurasiyanın yüklənməsi, analitika paketinin göndərilməsi.
WorkManager.getInstance(context)
.enqueueUniqueWork(
"sync_data",
ExistingWorkPolicy.KEEP,
syncRequest
)
CoroutineWorker tapşırığın yerin yetirilməsinin aralıq nəticələrini ötürməyə imkan verən setProgress mexanizmini dəstəkləyir. Bu, uzun müddətli əməliyyatlar üçün faydalıdır: böyük faylın yüklənməsi, şəkillərin toplu emalı, verilənlər bazasının miqrasiyası. UI getWorkInfosByTagLiveData vasitəsilə yenilənmələrə abunə ola və real vaxtda proqresi göstərə bilər. Tapşırıq istifadəçiyə görünən olmalıdırsa, Workeri Foreground Service kimi bildirişlə işə salmaq üçün ForegroundInfo metodu da mövcuddur.
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 Worker-lar arasında məlumat ötürməyi InputData və OutputData vasitəsilə dəstəkləyir. InputData Data.Builder vasitəsilə WorkRequest qurma mərhələsində yaradılır və Worker-ə inputData vasitəsilə ötürülür. İcradan sonra Worker workDataOf və ya Data.Builder vasitəsilə OutputData yaradır və onu Result.success(outputData) ilə birlikdə qaytarır. Zəncirdəki növbəti Worker əvvəlkinin outputData-sını öz inputData-sı kimi alır. Məlumatlar açar-dəyər formatında əsas tiplərlə saxlanılır: String, Int, Long, Boolean, Double. Data-nın maksimum ölçüsü 10 KB-dır.
Təcrübədə bir çox layihə WorkManager-dən yeganə fon tapşırıq planlayıcısı kimi istifadə edir. Google Android 4.4 (API 19) və daha aşağını dəstəkləyən proqramlarda bütün mövcud JobService-ləri WorkManager-ə miqrasiya etməyi tövsiyə edir, çünki JobScheduler mövcud deyil, WorkManager isə AlarmManager və BroadcastReceiver vasitəsilə ehtiyat mexanizmdən istifadə edir. Test üçün WorkManager TestListenableWorkerBuilder və TestWorkerBuilder təqdim edir ki, bunlar real planlayıcı olmadan JUnit testlərində Worker-ları test etməyə imkan verir.
WorkManager-i test etmək üçün AndroidX Test-dən TestListenableWorkerBuilder istifadə edin, o, Worker-i təcrid olunmuş mühitdə işə salmağa və qaytarılan Result-u yoxlamağa imkan verir. Kitabxana real planlayıcı olmadan vahid test üçün JUnit və Robolectric üçün tam dəstək təmin edir. Ümumiyyətlə, WorkManager əvvəllər Service və ya JobScheduler istifadə edilən tapşırıqların 80%-ə qədər işi üçün uyğundur.
Tez-tez verilən suallar
Bəli, WorkManager yenidən başlatmadan sonra belə icraya zəmanət verir. Kitabxana bütün tamamlanmamış tapşırıqları Room verilənlər bazasında saxlayır və sistem yükləndikdən sonra işə düşən BroadcastReceiver vasitəsilə onları bərpa edir.
Worker korutin və ya RxJava dəstəyi olmadan fon iplikdə işləyir. CoroutineWorker suspend funksiyaları və korutin çərçivəsi ilə Kotlin korutinlərindən istifadə edir. RxWorker Observable və Single ilə işləyir, reaktiv zəncirlər üçün uyğundur.
Ləğv etmək üçün workManager.cancelWorkById(id) və ya workManager.cancelAllWorkByTag("tag") istifadə edin. Kitabxana həmçinin müəyyən adlı unikal tapşırıqları ləğv etmək üçün cancelUniqueWork("name") metodu təqdim edir.
PeriodicWorkRequest üçün minimum fasilə 15 dəqiqədir. Bu məhdudiyyət Google tərəfindən batareyanın həddindən artıq istehlakının qarşısını almaq üçün müəyyən edilmişdir. Tapşırıq daha tez yerin yetirilməlidirsə, Foreground Service və ya timer ilə Handler istifadə edin.
Bəli, WorkManager API 14+ dəstəkləyir. JobScheduler olmayan cihazlarda (API 21-dən aşağı) kitabxana tapşırıqları planlaşdırmaq üçün AlarmManager və BroadcastReceiver kombinasiyasından istifadə edir. Bu, WorkManager-i fon tapşırıqları üçün universal həll yolu edir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun