Sparround

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 workenqueueUniqueWork(name, ExistingWorkPolicy.KEEP/REPLACE/APPEND) — dublikatların qarşısı.
  • ChainingbeginWith(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).

kotlin
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ıb runAttemptCount-un artdığını izlə.
  • Sync düyməsinə 5 dəfə bas — KEEP sayəsində bir iş qaldığını WorkManager.getWorkInfos ilə 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