WorkManager — bu Android uchun Jetpack kutubxonasi bo'lib, kechiktirilgan va fon vazifalarini bajarish kafolati bilan bajarish uchun mo'ljallangan. Service yoki JobScheduler-dan farqli o'laroq, WorkManager vazifaning hayotiy siklini boshqarishni o'z zimmasiga oladi: muvaffaqiyatsizlikda uni qayta ishga tushiradi, Android versiyasiga moslashadi va qurilma cheklovlarini hisobga oladi. Android Developers, 2026 ma'lumotlariga ko'ra, WorkManager zamonaviy Android-ishlanmasida ko'pchilik fon operatsiyalari uchun afzal qilingan yechimdir.
Asosiy
WorkManager — bu Android Jetpack-ning bir qismi, ilova oldingi planda bo'ladimi yoki foydalanuvchi tomonidan yopilganmi, kafolatlangan bajarilishi kerak bo'lgan fon vazifalarini boshqarish uchun kutubxona. Kutubxona API 14+ ni qo'llab-quvvatlaydi va avtomatik ravishda mos bajarish mexanizmini tanlaydi: Android 5+ da JobScheduler, eski versiyalarda BroadcastReceiver + AlarmManager.
WorkManager-ning asosiy xususiyati — bajarish kafolati. Agar vazifa qurilmani qayta ishga tushirish, ilovani to'xtatish yoki muvaffaqiyatsizlik tufayli tugallanmagan bo'lsa, WorkManager uni birinchi imkoniyatda qayta ishga tushiradi. Bu kutubxonani bajarilishi muhim bo'lgan vazifalar uchun ideal tanlovga aylantiradi: analitika yuborish, ma'lumotlar bazasini sinxronlash, fayllarni yuklash.
Background Service-dan farqli o'laroq, WorkManager iplar va hayotiy siklni boshqarishni talab qilmaydi. Kutubxona o'zi ip havzasini yaratadi, Doze Mode-ni boshqaradi, Android versiyasini hisobga oladi va API darajasidan qat'iy nazar yagona API ni ta'minlaydi. CoroutineWorker va RxWorker orqali korutinlar va RxJava bilan ishlash qo'llab-quvvatlanadi.
WorkManager vazifalar holatini kuzatish uchun LiveData uchun o'rnatilgan qo'llab-quvvatlashni ta'minlaydi. getWorkInfoByIdLiveData metodi ENQUEUED, RUNNING, SUCCEEDED, FAILED, CANCELLED holatlari har bir o'zgarishida yangilanadigan LiveData<WorkInfo> qaytaradi. Bu UI komponentlariga rejalashtiruvchini qo'lda so'roqsiz va Lifecycle-aware komponentlari tufayli xotira oqishisiz o'zgarishlarga reaksiya berishga imkon beradi.
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 uchta asosiy sinf atrofida qurilgan: Worker, WorkRequest va WorkManager. Worker vazifa mantig'ini o'z ichiga oladi, WorkRequest bajarish parametrlarini tavsiflaydi, WorkManager esa navbat va rejalashtirishni boshqaradi. Kutubxona barcha vazifalarning holatini saqlash uchun ichki Room ma'lumotlar bazasidan foydalanadi.
Worker — bu fon ipida chaqiriladigan yagona doWork metodi bilan mavhum sinf. Metod ListenableWorker.Result — SUCCESS, FAILURE yoki RETRY qaytaradi. WorkRequest Worker-ni parametrlar bilan bog'laydi: vaqt chegarasi, teg, boshlang'ich kechikish va cheklovlar.
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 versiyasidan qat'iy nazar vazifalarni yagona tarzda rejalashtiradi. enqueue chaqiruvida kutubxona vazifani Room-da saqlaydi, joriy shartlarni baholaydi va optimal ishga tushirish vaqtini tanlaydi. Ichki tizmada JobScheduler, AlarmManager yoki o'z rejalashtiruvchisi ishlatilishi mumkin — dasturchi bu haqda o'ylamasligi kerak.
val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
.setInitialDelay(15, TimeUnit.MINUTES)
.addTag("sync")
.build()
WorkManager.getInstance(context)
.enqueue(syncRequest)
WorkManager ikki turdagi bajarish so'rovlarini qo'llab-quvvatlaydi: bir martalik va davriy. Tur tanlash stsenariyga bog'liq: vazifa bir marta bajarilishi yoki belgilangan intervalda takrorlanishi kerak.
OneTimeWorkRequest bir marta bajarilishi kerak bo'lgan vazifalar uchun mo'ljallangan. Bu log yuborish, autentifikatsiyadan keyin ma'lumotlarni sinxronlash, birinchi ishga tushirishda konfiguratsiyani yuklash bo'lishi mumkin. Kechikish setInitialDelay orqali, cheklovlar esa setConstraints orqali o'rnatiladi.
PeriodicWorkRequest minimal 15 daqiqa interval bilan takrorlanadigan vazifalar uchun mos keladi. Kutubxona ishga tushirishlar orasidagi interval belgilanganidan kam bo'lmasligiga kafolat beradi, lekin qurilma cheklovlari tufayli ko'proq bo'lishi mumkin. Chastotasi 15 daqiqadan kam bo'lgan vazifalar uchun Foreground Service-da Handler yoki Timer dan foydalaning.
| Parametr | OneTimeWorkRequest | PeriodicWorkRequest |
|---|---|---|
| Chastota | bir marta | takroriy (min. 15 daq) |
| Miqdor | 1 bajarish | bekor qilishgacha |
| Kechikish | setInitialDelay | setInitialDelay |
| Zanjirlar | qo'llab-quvvatlaydi | yo'q |
| Foydalanish | yuklash, sinxronlash | monitoring, polling |
Cheklovlar (constraints) WorkManager-da vazifa qanday shartlarda ishga tushirilishi mumkinligini belgilashga imkon beradi: tarmoq ulanishi (NetworkType), batareya darajasi (batteryNotLow), xotira holati (StorageNotLow) va kutish rejimi (DeviceIdle). Barcha cheklovlar bajarilmaguncha vazifa ishga tushmaydi.
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresCharging(true)
.setRequiresBatteryNotLow(true)
.build()
val request = OneTimeWorkRequestBuilder<ImageUploadWorker>()
.setConstraints(constraints)
.build()
Zanjirlar (chaining) vazifalarning ketma-ket yoki parallel bajarilishini tashkil etishga imkon beradi. beginWith zanjirni boshlaydi, then oldingisi muvaffaqiyatli tugagandan so'ng bajariladigan keyingi Worker-ni qo'shadi. Parallel bajarish uchun workManager.enqueue(listOf(request1, request2)) ishlatiladi.
WorkManager.getInstance(context)
.beginWith(compressWorker)
.then(uploadWorker)
.then(cleanupWorker)
.enqueue()
// compress → upload → cleanup ketma-ket
JobScheduler Android 5 (API 21) da fon vazifalarini rejalashtirish uchun tizim xizmati sifatida joriy qilingan. WorkManager uni avtomatik migratsiya va qo'shimcha imkoniyatlar bilan o'rnini bosdi: zanjirlar, bajarish kafolati, teglar, LiveData orqali holatni kuzatish.
JobScheduler-dan WorkManager-ga migratsiya qilishda JobService ni Worker-ga, JobInfo ni WorkRequest-ga, Context.getSystemService ni WorkManager API-ga almashtirish kerak. WorkManager moslik muammolarini avtomatik hal qiladi va Doze Mode-ni qo'lda JobScheduler tatbiqidan ko'ra to'g'riroq boshqaradi. Migratsiya qadamlari: 1) Worker sinfini yarating, 2) bir xil shartlar bilan WorkRequest tuzing, 3) JobService va JobInfo ni kod va manifestdan o'chiring.
WorkManager ExistingWorkPolicy orqali unikal vazifalar konsepsiyasini qo'llab-quvvatlaydi. Belgilangan nomdagi vazifa allaqachon mavjud bo'lsa, siyosat xatti-harakatni belgilaydi: KEEP (yangisini yaratma), REPLACE (mavjudini almashtir), APPEND (zanjir oxiriga qo'shish) va APPEND_OR_REPLACE. UniqueWorkRequest takrorlanmasligi kerak bo'lgan vazifalar uchun qulay: ma'lumotlar bazasini sinxronlash, konfiguratsiyani yuklash, analitika paketini yuborish.
WorkManager.getInstance(context)
.enqueueUniqueWork(
"sync_data",
ExistingWorkPolicy.KEEP,
syncRequest
)
CoroutineWorker setProgress mexanizmini qo'llab-quvvatlaydi, bu vazifani bajarishning oraliq natijalarini uzatishga imkon beradi. Bu uzoq muddatli operatsiyalar uchun foydali: katta faylni yuklash, tasvirlarni paketli qayta ishlash, ma'lumotlar bazasini migratsiya qilish. UI getWorkInfosByTagLiveData orqali yangilanishlarga obuna bo'lishi va real vaqtda progressni ko'rsatishi mumkin. Agar vazifa foydalanuvchiga ko'rinadigan bo'lishi kerak bo'lsa, Worker-ni bildirishnoma bilan Foreground Service sifatida ishga tushirish uchun ForegroundInfo metodi ham mavjud.
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 o'rtasida ma'lumot uzatishni InputData va OutputData orqali qo'llab-quvvatlaydi. InputData WorkRequest qurish bosqichida Data.Builder orqali yaratiladi va Worker-ga inputData orqali uzatiladi. Bajarishdan so'ng Worker workDataOf yoki Data.Builder orqali OutputData yaratadi va uni Result.success(outputData) bilan qaytaradi. Zanjirdagi keyingi Worker oldingisining outputData sini o'z inputData si sifatida oladi. Ma'lumotlar asosiy turlarni qo'llab-quvvatlagan holda kalit-qiymat formatida saqlanadi: String, Int, Long, Boolean, Double. Data ning maksimal hajmi 10 KB.
Amalda ko'plab loyihalar WorkManager dan yagona fon vazifalari rejalashtiruvchisi sifatida foydalanadi. Google Android 4.4 (API 19) va undan pastini qo'llab-quvvatlaydigan ilovalarda barcha mavjud JobService larni WorkManager ga migratsiya qilishni tavsiya qiladi, chunki JobScheduler mavjud emas, WorkManager esa AlarmManager va BroadcastReceiver orqali zaxira mexanizmidan foydalanadi. Sinov uchun WorkManager TestListenableWorkerBuilder va TestWorkerBuilder ni taqdim etadi, ular real rejalashtiruvchisiz JUnit testlarida Worker larni test qilishga imkon beradi.
WorkManager ni test qilish uchun AndroidX Test dan TestListenableWorkerBuilder dan foydalaning, u Worker ni izolyatsiya qilingan muhitda ishga tushirish va qaytarilgan Result ni tekshirishga imkon beradi. Kutubxona real rejalashtiruvchisiz modul testlari uchun JUnit va Robolectric ni to'liq qo'llab-quvvatlaydi. Umuman, WorkManager ilgari Service yoki JobScheduler ishlatilgan vazifalarning 80% uchun mos keladi.
Tez-tez beriladigan savollar
Ha, WorkManager qayta ishga tushirishdan keyin ham bajarilishni kafolatlaydi. Kutubxona barcha tugallanmagan vazifalarni Room ma'lumotlar bazasida saqlaydi va tizim yuklangandan keyin ishga tushadigan BroadcastReceiver orqali ularni tiklaydi.
Worker korutinlar yoki RxJava qo'llab-quvvatlovisiz fon ipida ishlaydi. CoroutineWorker suspend funksiyalari va korutin doirasida bekor qilish bilan Kotlin korutinlaridan foydalanadi. RxWorker Observable va Single bilan ishlaydi, reaktiv zanjirlar uchun mos keladi.
Bekor qilish uchun workManager.cancelWorkById(id) yoki workManager.cancelAllWorkByTag("tag") dan foydalaning. Kutubxona, shuningdek, belgilangan nomli unikal vazifalarni bekor qilish uchun cancelUniqueWork("name") metodini taqdim etadi.
PeriodicWorkRequest uchun minimal interval 15 daqiqa. Bu cheklov Google tomonidan batareyaning ortiqcha iste'molini oldini olish uchun belgilangan. Agar vazifa tez-tez bajarilishi kerak bo'lsa, Foreground Service yoki taymer bilan Handler dan foydalaning.
Ha, WorkManager API 14+ ni qo'llab-quvvatlaydi. JobScheduler bo'lmagan qurilmalarda (API 21 dan past) kutubxona vazifalarni rejalashtirish uchun AlarmManager va BroadcastReceiver kombinatsiyasidan foydalanadi. Bu WorkManager ni fon vazifalari uchun universal yechimga aylantiradi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.