JobScheduler: الجوهر، API وجدولة المهام

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

JobScheduler هو خدمة نظام في Android، تم تقديمها في API 21 (Android 5.0 Lollipop)، تتيح للتطبيقات جدولة تنفيذ المهام في الخلفية بناءً على شروط محددة. على عكس AlarmManager، لا يتطلب JobScheduler وقت تنفيذ دقيق — يحدد النظام نفسه اللحظة المثلى من خلال الجمع بين متطلبات التطبيق والحالة الحالية للجهاز. وفقًا لـ Android Developers, 2026، تدعم الخدمة معايير الشبكة والشحن وحالة التخزين وخمول الجهاز.

الخلاصة

  • JobScheduler هو API نظام في Android 5+ للمعالجة المجمعة للمهام في الخلفية مع شروط التشغيل.
  • JobService هو فئة المعالج الأساسية التي يستدعيها النظام عند استيفاء شروط التنفيذ.
  • JobInfo هو كائن يصف معلمات المهمة: نوع الشبكة، مستوى البطارية، الموعد النهائي والتأخير.
  • المعايير تشمل الاتصال بشبكة Wi-Fi والشحن والتخزين المتاح وخمول الجهاز.
  • WorkManager يستخدم JobScheduler داخليًا على Android 5+، ويقدم واجهة برمجة تطبيقات ذات مستوى أعلى.

ما هو JobScheduler؟

JobScheduler هو خدمة نظام في Android تجمع مهام الخلفية المتعددة في دفعات لتقليل استهلاك الطاقة. بدلاً من أن يوقظ كل تطبيق الجهاز لتنفيذ مهمته الخاصة، يقوم JobScheduler بتجميعها معًا وتنفيذها في اللحظة المثلى عندما يكون الجهاز نشطًا بالفعل. وهذا يطيل عمر البطارية بشكل كبير.

قبل JobScheduler، كان المطورون يستخدمون AlarmManager و BroadcastReceiver للمهام في الخلفية. كانت مشكلة هذا النهج أن كل تطبيق كان يوقظ الجهاز بشكل مستقل، مما أدى إلى استنزاف سريع للبطارية. حل JobScheduler هذه المشكلة من خلال إدخال نافذة تنفيذ مجمعة، حيث يقوم النظام ضمنها بتشغيل جميع المهام المجدولة من تطبيقات مختلفة في وقت واحد.

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

كيف يعمل JobScheduler؟

JobScheduler يستخدم بنية تعتمد على JobService و JobInfo. يصف JobInfo المهمة وشروطها، ويحتوي JobService على منطق التنفيذ. يسجل التطبيق المهمة عبر getSystemService(JobScheduler.class) ويستدعي schedule(jobInfo). ويتولى النظام عملية الجدولة.

JobService و JobInfo

JobService هو فئة مجردة ترث من Service. يحتوي على طريقتين رئيسيتين: onStartJob (يُستدعى عند بدء المهمة) و onStopJob (يُستدعى عند إيقاف النظام للمهمة قسرًا). يتم إنشاء JobInfo عبر Builder ويحتوي على جميع معلمات المهمة: المعرف والشروط والقيود الزمنية.

java
public class SyncJobService extends JobService {
    @Override
    public boolean onStartJob(JobParameters params) {
        // يتم التنفيذ على الخيط الرئيسي
        Thread thread = new Thread(() -> {
            performSync();
            jobFinished(params, false);
        });
        thread.start();
        return true; // true = يستمر العمل
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return true; // true = إعادة جدولة المهمة
    }
}

معايير تشغيل المهمة

JobScheduler يسمح بتعيين معايير متعددة في وقت واحد: نوع الشبكة (NETWORK_TYPE_ANY، NOT_ROAMING، UNMETERED)، حالة الشحن (requiresCharging)، مستوى البطارية (requiresBatteryNotLow)، حالة التخزين (requiresStorageNotLow) ووضع الخمول (requiresDeviceIdle). يتم تشغيل المهمة فقط عند استيفاء جميع المعايير.

معلمات JobInfo

JobInfo.Builder يوفر إعدادات مرنة لكل مهمة في الخلفية. يسمح المزيج الصحيح من المعلمات بتحقيق التوازن بين توقيت التنفيذ واستهلاك الطاقة.

الطريقةالوصفمثال
setRequiredNetworkTypeنوع الشبكة المطلوبNETWORK_TYPE_UNMETERED
setRequiresChargingالجهاز قيد الشحنtrue
setRequiresDeviceIdleالجهاز في وضع الخمولtrue
setOverrideDeadlineأقصى وقت انتظار (مللي ثانية)300000
setMinimumLatencyالحد الأدنى للتأخير (مللي ثانية)60000
setPeriodicالتنفيذ الدوري (مللي ثانية)3600000
setBackoffCriteriaاستراتيجية إعادة المحاولة عند الفشلLINEAR / EXPONENTIAL

من المعلمات المهمة setOverrideDeadline. إذا تم تحديد موعد نهائي، يضمن النظام تشغيل المهمة بحلول ذلك الوقت، حتى لو لم تتحقق جميع الشروط. هذا مفيد للمهام ذات الوقت الحرج، مثل المزامنة كل 6 ساعات.

مثال استخدام JobScheduler

جدولة مهمة بشروط متعددة

سيناريو نموذجي هو مزامنة البيانات عند الاتصال بشبكة Wi-Fi وشحن الجهاز. ينشئ التطبيق JobInfo بالمعايير المناسبة ويمرره إلى JobScheduler. يقوم النظام بتشغيل المهمة عند توفر الظروف المناسبة.

java
ComponentName serviceName = new ComponentName(this, SyncJobService.class);

JobInfo jobInfo = new JobInfo.Builder(JOB_ID_SYNC, serviceName)
    .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
    .setRequiresCharging(true)
    .setRequiresBatteryNotLow(true)
    .setOverrideDeadline(6 * 60 * 60 * 1000) // 6 ساعات
    .build();

JobScheduler scheduler = (JobScheduler)
    getSystemService(Context.JOB_SCHEDULER_SERVICE);
scheduler.schedule(jobInfo);

تسجيل JobService في البيان

يجب تسجيل JobService في AndroidManifest.xml مع الإذن BIND_JOB_SERVICE. في طريقة onStartJob، من المهم استدعاء jobFinished بعد إكمال العمل — وإلا سيعتبر النظام أن المهمة تعمل إلى أجل غير مسمى وقد يوقفها قسرًا.

xml
<service
    android:name=".SyncJobService"
    android:permission="android.permission.BIND_JOB_SERVICE" />

القيود والبدائل

JobScheduler له عدة قيود. أولاً، إنه متاح فقط على Android 5+ — الإصدارات الأقدم تتطلب بديلاً. ثانيًا، قد يؤخر النظام مهام التطبيقات نادرة الاستخدام، خاصة على Android 9+ مع App Standby Buckets. ثالثًا، لا يوفر JobScheduler آلية إعادة تشغيل مضمونة عند الفشل.

توصي Google باستخدام WorkManager بدلاً من استخدام JobScheduler مباشرة. يستخدم WorkManager JobScheduler داخليًا على Android 5+، لكنه يضيف دعمًا للإصدارات الأقدم، وضمان التنفيذ، وسلاسل المهام، ومراقبة الحالة عبر LiveData. إذا كان تطبيقك يدعم Android 8+ فقط ولا يتطلب منطقًا معقدًا للمهام في الخلفية، فقد يظل JobScheduler مبررًا.

مراقبة وتصحيح JobScheduler

لتصحيح JobScheduler، استخدم dumpsys jobscheduler عبر ADB: يعرض الأمر جميع المهام المجدولة وحالتها والوقت المتبقي وتاريخ التنفيذ. لتطبيق معين: adb shell dumpsys jobscheduler | grep package_name. يتيح لك هذا التحقق مما إذا كانت المهمة مسجلة، وما هي الشروط المحددة، ولماذا لا يتم تشغيلها. يمكنك أيضًا استخدام JobScheduler.getPendingJob() للتحقق برمجيًا من حالة المهمة. بالإضافة إلى ذلك، يمكن استخدام Android Studio Profiler لتحليل استهلاك الطاقة أثناء تنفيذ المهام. بالنسبة للتطبيقات على Android 5+، يظل JobScheduler أداة موثوقة للمهام الخلفية غير الدقيقة مع شروط الشبكة والشحن.

JobScheduler في سيناريوهات تعدد الخيوط

افتراضيًا، يتم تنفيذ JobService في الخيط الرئيسي، لذلك تتطلب جميع العمليات المحظورة إنشاء خيط منفصل أو استخدام AsyncTask. لا يوفر JobScheduler مجموعة خيوط مدمجة، على عكس WorkManager. يدير المطور الخيوط والمزامنة بشكل مستقل. يوصى باستخدام ThreadPoolExecutor للمهام المتوازية و Handler للتواصل مع الخيط الرئيسي. في onStopJob، من المهم مقاطعة الخيوط العاملة بشكل صحيح لتجنب التسريبات.

المهام الدورية عبر JobScheduler

يدعم JobScheduler المهام الدورية من خلال طريقة setPeriodic(long intervalMillis). الحد الأدنى للفاصل الزمني هو 15 دقيقة. ومع ذلك، على عكس WorkManager، لا يضمن JobScheduler الالتزام الدقيق بالفاصل الزمني — قد يغير النظام موعد التنفيذ للتجميع مع مهام أخرى. لا تدعم طريقة setPeriodic أيضًا فاصلاً مرنًا (نافذة مرنة)، الذي ظهر في إصدارات API اللاحقة. للتنفيذ الدوري الدقيق، استخدم AlarmManager مع BroadcastReceiver.

App Standby Buckets وتأثيرها على JobScheduler

بدءًا من Android 9، قدمت Google App Standby Buckets، الذي يصنف التطبيقات حسب تكرار الاستخدام: Active و Working Set و Frequent و Rare. تواجه التطبيقات في الفئة Rare تأخيرات في تنفيذ مهام JobScheduler تصل إلى 24 ساعة. يمكن للمطورين التأثير على الفئة فقط من خلال جودة التطبيق — آليات النظام تزيد تلقائيًا أولوية التطبيقات التي يتفاعل معها المستخدم بانتظام. يراعي JobScheduler هذا التصنيف، وسيتم تنفيذ مهمة من تطبيق Rare فقط في نافذة الصيانة. بالنسبة للتطبيقات في الفئة Active (الأكثر استخدامًا)، تكون التأخيرات ضئيلة ويتم تنفيذ المهام فورًا تقريبًا عند استيفاء الشروط.

للمهام الدورية ذات الوقت الدقيق، JobScheduler غير مناسب — استخدم AlarmManager. للمهام القصيرة لمرة واحدة — Foreground Service مع إشعار. JobScheduler هو الأمثل للمهام حيث تكون كفاءة الطاقة أكثر أهمية من دقة الوقت: المزامنة، تنزيل التحديثات، معالجة البيانات المجمعة. يؤثر الاختيار الصحيح لأداة العمل في الخلفية مباشرة على تجربة المستخدم وعمر بطارية الجهاز. الخلاصة النهائية: استخدم JobScheduler للمعالجة المجمعة بشروط، و AlarmManager للمهام المجدولة، و WorkManager كمجداول عالمي.

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

هل صحيح أن JobScheduler يجمع مهام التطبيقات المختلفة؟

نعم، JobScheduler يجمع مهام التطبيقات المختلفة في دفعات وينفذها معًا. هذه ميزة رئيسية على AlarmManager: بدلاً من أن يوقظ كل تطبيق الجهاز بشكل منفصل، يوقظ النظام المعالج مرة واحدة ويعالج جميع المهام المجدولة.

ماذا يحدث إذا تم تنفيذ مهمة في JobService لفترة أطول من المحدد؟

إذا لم يتم استدعاء jobFinished خلال فترة زمنية معقولة، قد يستدعي النظام قسرًا onStopJob وينهي المهمة. يوصى بإكمال مهمة واحدة في غضون بضع دقائق ودائمًا استدعاء jobFinished عند الانتهاء.

كيف يتصرف JobScheduler في وضع Doze؟

في Doze Mode، يؤجل JobScheduler جميع المهام حتى نافذة الصيانة التالية، والتي تحدث بشكل دوري. استخدام setOverrideDeadline يضمن تنفيذ المهمة مع مراعاة هذه النوافذ، ولكن ليس بالضرورة في وقت محدد.

كيف يختلف JobScheduler عن WorkManager؟

WorkManager هي مكتبة تستخدم JobScheduler داخليًا على Android 5+. يضيف WorkManager ضمان التنفيذ، ودعم الإصدارات الأقدم (API 14+)، وسلاسل Worker، ومراقبة الحالة عبر LiveData/Flow، وإعادة المحاولة التلقائية عند الفشل.

كيفية إلغاء مهمة مجدولة في JobScheduler؟

للإلغاء، استخدم scheduler.cancel(JOB_ID) لمهمة محددة أو scheduler.cancelAll() لجميع مهام التطبيق. تأكد من أن معرف المهمة يتطابق مع المعرف المحدد عند إنشاء JobInfo، وإلا لن يتم إلغاء المهمة.

يجب على المطورين أن يفهموا أن JobScheduler هو API نظام منخفض المستوى مصمم للفرق ذات الخبرة التي تريد السيطرة الكاملة على مهام الخلفية للجهاز. بالنسبة لمعظم التطبيقات، يوفر WorkManager نفس الوظائف بواجهة برمجة تطبيقات أبسط وأكثر أمانًا وحداثة لنظام Android.

الملخص

  • JobScheduler هو خدمة نظام Android 5+ للتنفيذ المجمع للمهام في الخلفية بشروط محددة.
  • البنية تعتمد على JobService (المنطق) و JobInfo (المعلمات)، مسجلة عبر AndroidManifest.
  • معايير التشغيل تشمل الشبكة والشحن وحالة التخزين وخمول الجهاز.
  • setOverrideDeadline هي الطريقة الوحيدة لضمان تنفيذ المهمة بحلول وقت معين.
  • التنفيذ المجمع يجمع مهام التطبيقات المختلفة، مما يقلل من استهلاك الطاقة الكلي للجهاز.
  • WorkManager هو البديل المفضل مع ضمان التنفيذ ودعم الإصدارات الأقدم من Android.
  • لا تستخدم JobScheduler للمهام ذات الوقت الدقيق — استخدم AlarmManager بدلاً من ذلك.

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

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

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

اقرأ أيضًا