WorkManager والمهام في الخلفية
جدوِلوا أعمالًا مضمونة في الخلفية باستخدام WorkManager. استخدموا OneTimeWorkRequest وPeriodicWorkRequest والقيود وتمرير البيانات وربط الأعمال.
WorkManager والمهام في الخلفية درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 5 من أصل 6. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 6 دروس في المجموع.
العمل في الخلفية على Android
يقيّد Android العمل في الخلفية بشدة لتوفير البطارية. وقبل WorkManager، كان المطورون يستخدمون:
- AsyncTask (مهمل)
- AlarmManager (غير موثوق عبر عمليات إعادة التشغيل ووضع Doze)
- JobScheduler (واجهة API معقدة)
- Services (يمكن إيقافها ولا تدعم إعادة المحاولة)
WorkManager هو الحل الموصى به للعمل المؤجل والمضمون في الخلفية.
ما WorkManager؟
يضمن WorkManager تشغيل عملك حتى إذا أُوقف التطبيق أو أعيد تشغيل الجهاز. وهو:
- يحافظ على العمل عبر عمليات إعادة التشغيل
- يعيد المحاولة تلقائيًا عند الفشل
- يدعم القيود (شبكة WiFi فقط، أثناء الشحن فقط، وغير ذلك)
- يعمل على API 14 فأحدث
- يتكامل مع Kotlin Coroutines من خلال
CoroutineWorker
الإعداد
أضف WorkManager إلى app/build.gradle:
dependencies {
implementation 'androidx.work:work-runtime-ktx:2.9.0'
}إنشاء Worker
وسّع CoroutineWorker ونفّذ doWork(). أعد Result.success() أو Result.failure() أو Result.retry():
class SyncWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
return try {
// This runs on a background coroutine
val repo = UserRepository(applicationContext)
repo.syncFromNetwork()
Result.success()
} catch (e: Exception) {
if (runAttemptCount < 3) Result.retry()
else Result.failure()
}
}
}OneTimeWorkRequest
جدوِل مهمة لمرة واحدة وأضفها إلى قائمة التنفيذ:
val syncWork = OneTimeWorkRequestBuilder<SyncWorker>()
.setInitialDelay(10, TimeUnit.MINUTES) // optional delay
.build()
WorkManager.getInstance(context).enqueue(syncWork)
// With a unique name (prevents duplicates):
WorkManager.getInstance(context).enqueueUniqueWork(
"sync_work",
ExistingWorkPolicy.KEEP, // don't enqueue if already pending
syncWork
)PeriodicWorkRequest
جدوِل المهام المتكررة. الحد الأدنى للفاصل الزمني هو 15 دقيقة:
val periodicSync = PeriodicWorkRequestBuilder<SyncWorker>(
repeatInterval = 1, TimeUnit.HOURS
).build()
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
"hourly_sync",
ExistingPeriodicWorkPolicy.KEEP,
periodicSync
)القيود
شغّل العمل فقط عند استيفاء الشروط — مثل ألا تكون البطارية منخفضة وأن يكون WiFi متصلًا، وغير ذلك:
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED) // WiFi only
.setRequiresBatteryNotLow(true)
.setRequiresCharging(false)
.build()
val work = OneTimeWorkRequestBuilder<SyncWorker>()
.setConstraints(constraints)
.build()
WorkManager.getInstance(context).enqueue(work)بيانات الإدخال والإخراج
مرّر البيانات إلى Worker ومنه باستخدام كائنات Data:
// Enqueue with input data:
val inputData = workDataOf("user_id" to 42)
val work = OneTimeWorkRequestBuilder<SyncWorker>()
.setInputData(inputData)
.build()
// Inside the Worker:
class SyncWorker(...) : CoroutineWorker(...) {
override suspend fun doWork(): Result {
val userId = inputData.getInt("user_id", -1)
// Pass output data back:
val output = workDataOf("synced_count" to 10)
return Result.success(output)
}
}مراقبة حالة العمل
راقب تقدم العمل باستخدام getWorkInfoByIdLiveData:
val workRequest = OneTimeWorkRequestBuilder<SyncWorker>().build()
WorkManager.getInstance(this).enqueue(workRequest)
WorkManager.getInstance(this)
.getWorkInfoByIdLiveData(workRequest.id)
.observe(this) { info ->
when (info?.state) {
WorkInfo.State.RUNNING -> binding.tvStatus.text = "Syncing..."
WorkInfo.State.SUCCEEDED -> binding.tvStatus.text = "Done!"
WorkInfo.State.FAILED -> binding.tvStatus.text = "Failed"
else -> {}
}
}تسلسل الأعمال
شغّل المهام بالتتابع أو بالتوازي باستخدام سلاسل العمل:
val downloadWork = OneTimeWorkRequestBuilder<DownloadWorker>().build()
val processWork = OneTimeWorkRequestBuilder<ProcessWorker>().build()
val uploadWork = OneTimeWorkRequestBuilder<UploadWorker>().build()
// Sequential: download → process → upload
WorkManager.getInstance(context)
.beginWith(downloadWork)
.then(processWork)
.then(uploadWork)
.enqueue()
// Parallel then merge:
WorkManager.getInstance(context)
.beginWith(listOf(downloadWork, processWork)) // both run in parallel
.then(uploadWork) // runs after both finish
.enqueue()WorkManager مقابل البدائل
متى تستخدم كل خيار:
- WorkManager — عمل مؤجل ومضمون قائم على القيود. وهو الأفضل للمزامنة والرفع والتنظيف.
- Coroutines / ViewModel — عمل مرتبط بكون التطبيق مفتوحًا. يتوقف عند إيقاف التطبيق.
- AlarmManager — منبهات بوقت محدد (لتذكيرات التقويم). يتطلب عناية بإدارة البطارية.
- Foreground Service — مهام طويلة المدة يكون المستخدم على علم بها (مثل تشغيل الموسيقى والملاحة).
تحقق سريع
ما الحد الأدنى للفاصل الزمني للتكرار في PeriodicWorkRequest؟
مراجعة: WorkManager
يُعد WorkManager الأداة المناسبة للعمل المضمون في الخلفية:
- وسّع
CoroutineWorkerونفّذdoWork() - أعد
Result.success()أو.failure()أو.retry() - استخدم
OneTimeWorkRequestللتنفيذ مرة واحدة، وPeriodicWorkRequestللتنفيذ المتكرر - أضف
Constraintsلشروط مثل WiFi فقط وحالة البطارية وغير ذلك - مرّر البيانات باستخدام
workDataOf() - سلسل المهام باستخدام
beginWith().then().enqueue()
التالي: مكونات Material Design لإنشاء واجهات مستخدم جميلة.
الأسئلة الشائعة
هل درس «WorkManager والمهام في الخلفية» مجاني؟
نعم — نص درس «WorkManager والمهام في الخلفية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 6 دروس في المجموع.
ماذا ستتعلم في «WorkManager والمهام في الخلفية»؟
جدوِلوا أعمالًا مضمونة في الخلفية باستخدام WorkManager. استخدموا OneTimeWorkRequest وPeriodicWorkRequest والقيود وتمرير البيانات وربط الأعمال. تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟
لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 5 من أصل 6.
كم من الوقت يستغرق درس «WorkManager والمهام في الخلفية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟
نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Retrofit وواجهات REST API
- تحميل الصور باستخدام Coil
- معالجة الأخطاء وتجربة المستخدم
- الإشعارات الفورية
- WorkManager والمهام في الخلفية
- النشر على Play Store