محتويات الدورة

تطوير Android / المتقدم: أنظمة محمولة وإصدارات موثوقة / الدرس 14

العمل الخلفي الدائم والجدولة

اختر آلية خلفية بحسب الاستعجال والرؤية والدوام مع احترام حدود جدولة المنصة.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • استخدم WorkManager للعمل الدائم القابل للتأجيل المناسب.
  • صمّم عمالاً لا يكررون الأثر وصنف الإخفاقات القابلة للإعادة.

صنّف العمل قبل اختيار الواجهة

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

اجعل إعادة العامل آمنة

قد يتوقف العامل ويعمل مجدداً، فيجب أن تتحمل عملية الأعمال التكرار. احفظ هوية العملية وتقدمها خارج كائن العامل؛ تختفي حقول المنشئ مع العملية. أعد retry للفشل المؤقت فعلاً وfailure لإدخال أو سياسة غير قابلة للتعافي وsuccess عندما تكتمل العملية الدائمة أو تكون مكتملة مسبقاً. لا تبتلع إلغاء coroutine. اجعل بيانات الإدخال صغيرة ومرّر معرّفاً يستخرج الحمولة من التخزين. لا تدّع تنفيذ الخادم مرة واحدة لمجرد إدراج طلب عمل محلي واحد.

kotlin عامل تملك عمليته المحقونة التقدم الدائم
interface PendingSync { suspend fun drain() }

class SyncWorker(
    context: Context,
    params: WorkerParameters,
    private val sync: PendingSync
) : CoroutineWorker(context, params) {
    override suspend fun doWork(): Result = try {
        sync.drain()
        Result.success()
    } catch (e: CancellationException) {
        throw e
    } catch (e: IOException) {
        Result.retry()
    }
}

استخدم work-runtime-ktx متوافقاً واستيرادات AndroidX Work. لأن المنشئ يملك اعتماداً ثالثاً سجّل WorkerFactory مخصصاً أو تكامل حقن مدعوماً؛ لا يستطيع المصنع الافتراضي إنشاءه. يجب أن ينفذ PendingSync منع تكرار الأثر وتصنيف الإخفاقات الدائمة بدلاً من اعتبارها كلها إعادة إدخال وإخراج.

عبّر عن القيود وسياسة التكرار

تصف القيود شروطاً كتوافر الشبكة لا موعد تنفيذ نهائياً. يصبح الطلب مؤهلاً عند تحققها لكن Android ما زال يجدول التنفيذ الفعلي. يمنع العمل الفريد سلاسل متوازية عرضية تحت اسم ثابت. تحتفظ KEEP بعمل غير منته وقد تلائم تفريغ طابور، لكن وصول طلب جديد أثناء انتهاء التفريغ يحتاج تسليماً حذراً كي لا تبقى سجلات عالقة. يظل الطابور الدائم المرجع؛ الجدولة إشارة للتقدم وليست النسخة الوحيدة للعملية.

kotlin طلب تفريغ طابور فريد ومقيد
val request = OneTimeWorkRequestBuilder<SyncWorker>()
    .setConstraints(Constraints.Builder()
        .setRequiredNetworkType(NetworkType.CONNECTED)
        .build())
    .build()

WorkManager.getInstance(context).enqueueUniqueWork(
    "reading-sync", ExistingWorkPolicy.KEEP, request
)

نفذه بعد حفظ العمليات المعلقة وضبط مصنع العامل السابق. لا تضمن CONNECTED الوصول للخلفية، فيظل العامل يعالج فشل الإدخال والإخراج. استخدم بنية التطبيق لمصالحة الصفوف المعلقة بعد الانقطاع واختر سياسة العمل الفريد وفق التصميم.

احترم قيود الجدولة والخدمات الأمامية

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

راقب النتائج الدائمة واختبر الانقطاع

يبلغ WorkInfo عن حالة المجدول، بينما يشرح تخزين المجال هل عملية المستخدم في الطابور أو متزامنة أو تحتاج تدخلاً. الحالتان مرتبطتان وليستا متطابقتين؛ فقد يعالج عامل سجلات عدة. اختبر فقد الاتصال والإلغاء والإعادة بعد تقدم جزئي وإعادة العملية وتكرار الجدولة. يخضع التطبيق الموقوف إجبارياً لقيود يفرضها المستخدم، فلا تعد بتنفيذ فوري. قيّد الإعادة بسياسة أعمال واكشف الأخطاء الدائمة القابلة للتصرف وقِس عمر الطابور كي لا يختبئ الفشل المتكرر وراء مؤشر مطمئن.

الأخطاء الشائعة وإصلاحها

يفشل إنشاء العامل

لماذا يحدث؟
يفتقد المنشئ المحقون مصنع عامل مسجلاً.
كيف تصلحه؟
اضبط WorkerFactory أو تكامل الحقن المدعوم.
كيف تتجنب تكراره؟
اختبر إنشاء العامل عبر WorkManager لا الإنشاء المباشر فقط.

يتأخر تذكير دوري

لماذا يحدث؟
اختلطت الجدولة غير الدقيقة بالمنبه الدقيق.
كيف تصلحه؟
استخدم آلية المنصة المناسبة لمتطلب الوقت.
كيف تتجنب تكراره؟
وثق سماح الوقت وتحقق من قواعد الأهلية.

ترفع المحاولات سجلاً مرتين

لماذا يحدث؟
تفتقد العملية البعيدة منع تكرار دائماً.
كيف تصلحه؟
احفظ معرّفات عمليات ثابتة وافرض منع التكرار بالخادم.
كيف تتجنب تكراره؟
اختبر الانقطاع بعد قبول الخادم وقبل الإقرار المحلي.

اختبر فهمك

1. يريد فريق تنفيذ WorkManager كل ثلاثين ثانية. اشرح عدم التوافق والمتطلب الذي يحدد البديل.

اعرض الحل المشروح

حد العمل الدوري خمس عشرة دقيقة ويبقى غير دقيق. حدّد هل المطلوب استطلاع واجهة أمامية أو عمل مستمر مرئي فعلاً أو مزامنة قابلة للتأجيل. اختر الآلية وسياسة البطارية من التصنيف بدلاً من إجبار المجدول الدائم على التصرف كمؤقت.

2. تقبل الخلفية رفعاً ثم يتوقف العامل قبل الإقرار المحلي. صف التشغيل التالي.

اعرض الحل المشروح

يعثر على معرّف العملية المعلقة نفسه ويعيده بالهوية ذاتها. تعيد الخلفية النتيجة المثبتة بدلاً من نسخة أخرى ثم يسجل العميل الاكتمال ذرياً. لهذا لا تكفي فرادة المجدول وحدها؛ فالنتيجة المبهمة تعبر حد الشبكة.

أهم ما تعلمته

  • ينتمي الدوام إلى حالة عملية مخزنة.
  • قيود الجدولة ليست مواعيد نهائية.
  • يجب مراجعة حدود المنصة ودلالات الإعادة معاً.

المراجع الرسمية