WorkManager və background iş
WorkManager — təxirə salına bilən, zəmanətli background iş üçün Jetpack həllidir: iş tətbiq bağlansa da, cihaz restart olsa da (persistTaskları DB-də saxlayır) icra olunacaq.
Əsas anlayışlar:
- Worker / CoroutineWorker — işin özü:
doWork()Result.success() / failure() / retry()qaytarır. - WorkRequest — OneTimeWorkRequest / PeriodicWorkRequest (minimum interval 15 dəqiqə).
- Constraints — şəbəkə var, enerji qənaəti deyil, charging və s.
- Backoff policy — retry-lar üçün LINEAR/EXPONENTIAL gecikmə.
- Unique work —
enqueueUniqueWork(name, ExistingWorkPolicy.KEEP/REPLACE/APPEND)— dublikatların qarşısı. - Chaining —
beginWith(A).then(B).enqueue()— ardıcıl/paralel zəncirlər.
Nə vaxt WorkManager deyil: dərhal icra olunmalı iş (coroutine), istifadəçi baxarkən davam edən iş (foreground service), server tərəfindən oyandırılan iş (FCM push). Dəqiq vaxtda icra üçün AlarmManager (setExactAndAllowWhileIdle).
class UploadAuditLogsWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result = try {
val logs = logStore.pending()
api.uploadLogs(logs)
logStore.markUploaded(logs)
Result.success()
} catch (e: IOException) {
if (runAttemptCount < 5) Result.retry() else Result.failure()
}
}
val request = OneTimeWorkRequestBuilder<UploadAuditLogsWorker>()
.setConstraints(
Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
)
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 30, TimeUnit.SECONDS)
.build()
WorkManager.getInstance(context).enqueueUniqueWork(
"upload_audit_logs",
ExistingWorkPolicy.KEEP, // artıq növbədədirsə, təzəsini əlavə etmə
request
)Zəmanətli log göndərişi: constraint + retry + unique
Klassik müqayisə sualı — "sync-i necə edərsən?": dərhal + istifadəçi gözləyir → coroutine + repository; təxirəsalına bilən + zəmanətli (log, analytics, backup) → WorkManager; dəqiq vaxt (namaz vaxtı bildirişi, ödəniş xatırlatması) → AlarmManager; server bilir nə vaxt (yeni tranzaksiya) → FCM push → WorkManager-ə ötür. Doze mode-u da bil: cihaz yatanda WorkManager pəncərələrdə icra edir, dəqiqlik zəmanəti yoxdur.
🛠 Tapşırıq
Bir CoroutineWorker yaz: şəbəkə şərti (NetworkType.CONNECTED) + exponential backoff + enqueueUniqueWork(KEEP).
- Uçuş rejimində işi növbəyə qoy, tətbiqi tam bağla, sonra interneti aç — işin özü-özünə icra olunduğunu logla.
Result.retry()qaytarıbrunAttemptCount-un artdığını izlə.- Sync düyməsinə 5 dəfə bas —
KEEPsayəsində bir iş qaldığınıWorkManager.getWorkInfosilə təsdiqlə.
Bitdi sayılır: "bunu WorkManager, foreground service, yoxsa AlarmManager ilə edərdin" sualına qərar ağacın hazırdırsa.
📚 Mənbələr və sənədlər
- WorkManagerrəsmideveloper.android.com
- Background işlərin icmalırəsmideveloper.android.com