WorkManager — ما هو، واجهة البرمجة وجدولة المهام

المؤلف: IT Sectr نُشر: 2026-03-27 وقت القراءة: 8 دق

WorkManager هي مكتبة Android Jetpack مصممة لتنفيذ المهام المؤجلة والخلفية مع ضمان التنفيذ. على عكس Service أو JobScheduler، يتولى WorkManager إدارة دورة حياة المهمة: يعيد تشغيلها عند الفشل، ويتكيف مع إصدار Android، ويراعي قيود الجهاز. وفقًا لـ Android Developers, 2026، فإن WorkManager هو الحل المفضل لمعظم العمليات الخلفية في تطوير Android الحديث.

الملخص

  • WorkManager هي مكتبة Jetpack للمهام الخلفية مع ضمان التنفيذ، بغض النظر عن إصدار Android.
  • Worker هي الفئة الأساسية لتحديد منطق المهمة الخلفية، والتي تنفذها المكتبة في سلسلة منفصلة.
  • WorkRequest يمكن أن يكون لمرة واحدة (OneTimeWorkRequest) ودوريًا (PeriodicWorkRequest) بفاصل زمني لا يقل عن 15 دقيقة.
  • سلاسل المهام تسمح بترتيب تنفيذ متسلسل أو متوازي لعدة Workers.
  • القيود تحدد شروط التشغيل: شحن البطارية، الاتصال بالشبكة، حالة التخزين.

ما هو WorkManager؟

WorkManager هو جزء من Android Jetpack، مكتبة لإدارة المهام الخلفية التي يجب تنفيذها بشكل مضمون، بغض النظر عما إذا كان التطبيق في المقدمة أو تم إغلاقه من قبل المستخدم. تدعم المكتبة API 14+ وتختار تلقائيًا آلية التنفيذ المناسبة: JobScheduler على Android 5+، BroadcastReceiver + AlarmManager على الإصدارات الأقدم.

الميزة الرئيسية لـ WorkManager هي ضمان التنفيذ. إذا لم تكتمل المهمة بسبب إعادة تشغيل الجهاز أو إيقاف التطبيق أو تعطله، فسيقوم WorkManager بإعادة تشغيلها في أول فرصة. هذا يجعل المكتبة خيارًا مثاليًا للمهام الحرجة: إرسال التحليلات، مزامنة قاعدة البيانات، تحميل السجلات.

على عكس Background Service، لا يتطلب WorkManager إدارة سلاسل التنفيذ ودورة الحياة. المكتبة نفسها تنشئ مجموعة سلاسل، وتتعامل مع وضع Doze Mode، وتراعي إصدار Android، وتوفر واجهة برمجة موحدة بغض النظر عن مستوى API. دعم Coroutines و RxJava متاح من خلال CoroutineWorker و RxWorker على التوالي.

مراقبة الحالة عبر LiveData

يوفر WorkManager دعمًا مدمجًا لـ LiveData لتتبع حالات المهام. طريقة getWorkInfoByIdLiveData ترجع LiveData<WorkInfo> التي يتم تحديثها عند كل تغيير في الحالة: ENQUEUED، RUNNING، SUCCEEDED، FAILED، CANCELLED. هذا يسمح لمكونات واجهة المستخدم بالتفاعل مع التغييرات دون استقصاء يدوي للمجدول وبدون تسرب للذاكرة بفضل مكونات Lifecycle-aware.

kotlin
WorkManager.getInstance(context)
    .getWorkInfoByIdLiveData(syncRequest.id)
    .observe(viewLifecycleOwner) { workInfo ->
        when (workInfo.state) {
            WorkInfo.State.SUCCEEDED ->
                showSuccess()
            WorkInfo.State.FAILED ->
                showError(workInfo.outputData)
            else ->
                showProgress()
        }
    }

كيف يعمل WorkManager؟

هندسة WorkManager مبنية حول ثلاث فئات أساسية: Worker و WorkRequest و WorkManager. Worker يحتوي على منطق المهمة، WorkRequest يصف معايير التنفيذ، و WorkManager يدير قائمة الانتظار والجدولة. تستخدم المكتبة قاعدة بيانات Room داخلية لتخزين حالة جميع المهام.

Worker و WorkRequest

Worker هي فئة مجردة بطريقة واحدة doWork يتم استدعاؤها في سلسلة خلفية. الطريقة ترجع ListenableWorker.Result — SUCCESS أو FAILURE أو RETRY. WorkRequest يربط Worker بالمعايير: المهلة، الوسم، التأخير الأولي والقيود.

kotlin
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

WorkManager يخطط المهام بشكل موحد بغض النظر عن إصدار Android. عند استدعاء enqueue، تحفظ المكتبة المهمة في Room، وتقييم الظروف الحالية، وتختار الوقت الأمثل للتنفيذ. داخليًا، قد تستخدم JobScheduler أو AlarmManager أو المجدول الخاص بها — لا يحتاج المطور إلى القلق بشأن ذلك.

kotlin
val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
    .setInitialDelay(15, TimeUnit.MINUTES)
    .addTag("sync")
    .build()

WorkManager.getInstance(context)
    .enqueue(syncRequest)

أنواع WorkRequest

WorkManager يدعم نوعين من طلبات التنفيذ: لمرة واحدة ودورية. يعتمد اختيار النوع على السيناريو: يجب تنفيذ المهمة مرة واحدة أو التكرار بفاصل زمني محدد.

OneTimeWorkRequest

OneTimeWorkRequest مصمم للمهام التي يجب تنفيذها مرة واحدة. يمكن أن يكون إرسال سجل، مزامنة البيانات بعد التفويض، تنزيل التكوين عند التشغيل الأول. يتم تعيين التأخير عبر setInitialDelay، والقيود عبر setConstraints.

PeriodicWorkRequest

PeriodicWorkRequest مناسب للمهام المتكررة بفاصل زمني لا يقل عن 15 دقيقة. تضمن المكتبة أن الفاصل الزمني بين عمليات التشغيل لن يقل عن المحدد، ولكنه قد يكون أطول بسبب قيود الجهاز. للمهام ذات التردد الأقل من 15 دقيقة، استخدم Handler أو Timer في Foreground Service.

المعاملOneTimeWorkRequestPeriodicWorkRequest
الترددمرة واحدةمتكرر (15 دقيقة كحد أدنى)
العددتنفيذ واحدحتى الإلغاء
التأخيرsetInitialDelaysetInitialDelay
السلاسليدعملا
الاستخدامتنزيل، مزامنةمراقبة، استقصاء

إعداد القيود وسلاسل المهام

القيود في WorkManager تسمح بتعيين الشروط التي يمكن بموجبها تشغيل المهمة: الاتصال بالشبكة (NetworkType)، مستوى البطارية (batteryNotLow)، حالة التخزين (StorageNotLow) ووضع الخمول (DeviceIdle). لن تبدأ المهمة حتى يتم استيفاء جميع القيود.

kotlin
val constraints = Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .setRequiresCharging(true)
    .setRequiresBatteryNotLow(true)
    .build()

val request = OneTimeWorkRequestBuilder<ImageUploadWorker>()
    .setConstraints(constraints)
    .build()

السلاسل تسمح بتنظيم التنفيذ المتسلسل أو المتوازي للمهام. beginWith يبدأ سلسلة، ثم يضيف Worker التالي الذي سيتم تنفيذه بعد الانتهاء بنجاح من السابق. للتنفيذ المتوازي، استخدم workManager.enqueue(listOf(request1, request2)).

kotlin
WorkManager.getInstance(context)
    .beginWith(compressWorker)
    .then(uploadWorker)
    .then(cleanupWorker)
    .enqueue()
    // compress -> upload -> cleanup بالتسلسل

الترحيل من JobScheduler إلى WorkManager

JobScheduler تم تقديمه في Android 5 (API 21) كخدمة نظام لجدولة المهام الخلفية. جاء WorkManager ليحل محله، مقدمًا واجهة برمجة متعددة المنصات مع ترحيل تلقائي وإمكانيات إضافية: السلاسل، ضمان التنفيذ، الوسوم، مراقبة الحالة عبر LiveData.

عند الترحيل من JobScheduler إلى WorkManager، ستحتاج إلى تحويل JobService إلى Worker، واستبدال JobInfo بـ WorkRequest، و Context.getSystemService بواجهة WorkManager. يتولى WorkManager تلقائيًا مشاكل التوافق ويعالج وضع Doze Mode بشكل أكثر صحة من التنفيذ اليدوي لـ JobScheduler. خطوات الترحيل: 1) إنشاء فئة Worker، 2) بناء WorkRequest بنفس الشروط، 3) إزالة JobService و JobInfo من الكود والملف البياني.

UniqueWork للمهام الفريدة

يدعم WorkManager مفهوم المهام الفريدة من خلال ExistingWorkPolicy. إذا كانت مهمة بالاسم المحدد موجودة بالفعل، تحدد السياسة السلوك: KEEP (عدم إنشاء مهمة جديدة)، REPLACE (استبدال الموجودة)، APPEND (إضافة إلى نهاية السلسلة) و APPEND_OR_REPLACE. UniqueWorkRequest مناسب للمهام التي لا يجب أن تتكرر: مزامنة قاعدة البيانات، تنزيل التكوين، إرسال حزمة التحليلات.

kotlin
WorkManager.getInstance(context)
    .enqueueUniqueWork(
        "sync_data",
        ExistingWorkPolicy.KEEP,
        syncRequest
    )

معالجة التقدم والنتائج الوسيطة

يدعم CoroutineWorker آلية setProgress، مما يسمح بتمرير نتائج التنفيذ الوسيطة. هذا مفيد للعمليات الطويلة: تنزيل ملف كبير، معالجة صور مجمعة، ترحيل قاعدة البيانات. يمكن لواجهة المستخدم الاشتراك في التحديثات عبر getWorkInfosByTagLiveData وعرض التقدم في الوقت الفعلي. طريقة ForegroundInfo متاحة أيضًا لتشغيل Worker كـ Foreground Service مع إشعار إذا كانت المهمة يجب أن تكون مرئية للمستخدم.

kotlin
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()
    }
}

InputData و OutputData لنقل البيانات

يدعم WorkManager نقل البيانات بين Workers عبر InputData و OutputData. يتم إنشاء InputData أثناء بناء WorkRequest عبر Data.Builder ويتم تمريره إلى Worker عبر inputData. بعد التنفيذ، ينشئ Worker OutputData عبر workDataOf أو Data.Builder ويعيده مع Result.success(outputData). Worker التالي في السلسلة يستقبل outputData من السابق كـ inputData خاص به. يتم تخزين البيانات بتنسيق مفتاح-قيمة مع دعم الأنواع الأساسية: String, Int, Long, Boolean, Double. الحد الأقصى لحجم Data هو 10 كيلوبايت.

من الناحية العملية، تستخدم العديد من المشاريع WorkManager كالمجدول الوحيد للمهام الخلفية. توصي Google بترحيل جميع JobService الموجودة إلى WorkManager، خاصة في التطبيقات التي تدعم Android 4.4 (API 19) وما دونه، حيث يكون JobScheduler غير متاح ويستخدم WorkManager آلية احتياطية عبر AlarmManager و BroadcastReceiver. للاختبار، يوفر WorkManager TestListenableWorkerBuilder و TestWorkerBuilder، مما يسمح باختبار Workers في اختبارات JUnit بدون مجدول حقيقي.

لاختبار WorkManager، استخدم TestListenableWorkerBuilder من AndroidX Test، الذي يسمح بتشغيل Workers في بيئة معزولة والتحقق من Result المرتجع. توفر المكتبة دعمًا كاملاً لـ JUnit و Robolectric للاختبارات الوحدوية بدون مجدول حقيقي. بشكل عام، WorkManager مناسب لـ 80% من المهام حيث كانت Service أو JobScheduler تستخدم سابقًا.

الأسئلة الشائعة

هل يضمن WorkManager تنفيذ المهمة بعد إعادة تشغيل الجهاز؟

نعم، WorkManager يضمن التنفيذ حتى بعد إعادة التشغيل. تحفظ المكتبة جميع المهام غير المكتملة في قاعدة بيانات Room وتستعيدها باستخدام BroadcastReceiver الذي يتم تشغيله بعد إقلاع النظام.

ما الفرق بين Worker و CoroutineWorker و RxWorker؟

Worker يعمل في سلسلة خلفية بدون دعم coroutines أو RxJava. CoroutineWorker يستخدم coroutines من Kotlin مع دعم دوال suspend والإلغاء عبر نطاق coroutine. RxWorker يعمل مع Observable و Single، ومناسب للسلاسل التفاعلية.

كيفية إلغاء مهمة في WorkManager؟

استخدم workManager.cancelWorkById(id) أو workManager.cancelAllWorkByTag("tag"). توفر المكتبة أيضًا طريقة cancelUniqueWork("name") لإلغاء المهام الفريدة بالاسم المحدد.

ما هو الفاصل الزمني الأدنى لـ PeriodicWorkRequest؟

الفاصل الزمني الأدنى لـ PeriodicWorkRequest هو 15 دقيقة. هذا الحد تم وضعه بواسطة Google لمنع الاستهلاك المفرط للبطارية. إذا كانت المهمة تحتاج إلى التنفيذ بشكل متكرر، استخدم Foreground Service أو Handler مع مؤقت.

هل يدعم WorkManager Android 4.4 وما دونه؟

نعم، WorkManager يدعم API 14+. على الأجهزة التي لا تحتوي على JobScheduler (أقل من API 21)، تستخدم المكتبة مزيجًا من AlarmManager و BroadcastReceiver لجدولة المهام. هذا يجعل WorkManager حلاً عالميًا للمهام الخلفية.

الخلاصة

  • WorkManager هي مكتبة Jetpack حديثة للمهام الخلفية مع ضمان التنفيذ على جميع إصدارات Android.
  • ثلاث فئات أساسية — Worker و WorkRequest و WorkManager — تغطي جميع سيناريوهات الجدولة والتنفيذ.
  • نوعان من الطلبات — OneTimeWorkRequest و PeriodicWorkRequest — للمهام لمرة واحدة والمتكررة.
  • القيود (الشبكة، البطارية، التخزين) تحمي المهمة من التنفيذ في ظروف غير مواتية.
  • سلاسل المهام تضمن التنفيذ المتسلسل للـ Workers مع تمرير النتيجة.
  • CoroutineWorker و RxWorker يدعمان البرمجة غير المتزامنة عبر coroutines و RxJava.
  • WorkManager يحل محل JobScheduler و Service و AlarmManager في معظم سيناريوهات المهام الخلفية.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا