استخدام الـ Firebase JobDispatcher

Mohammad Laifمنذ 3 سنوات

بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته

 

في الدرس السابق تعلمنا انشاء وجدولة المهام والاعمال بإستخدام الـ Android JobScheduler ولكنه للإسف لايدعم جميع الـ API (الهواتف القديمة) لذلك في هذا الدرس سنقوم بإستخدام الـ Firebase JobDispatcher فهو مشابه له تماماً ولكن يمتاز بالسهولة والمرونة والدعم الكبير.

 

الـ Firebase JobDispatcher يعتبر افضل من الـ Android JobSchedualer بكثير. فهو يدعم مميزات وهواتف اكثر. ولكن الان ينصح بإستخدام الـ WorkManager (سنقوم بالتطرق له في الدرس القادم) من حزمة الـ JetPack كما جاء شرح بعض مكوناتها في الدورة: Android Architecture Components.

 

نقاط يجب عليك مراعاتها

  • الـ JobDispatcher مبني على الـ Service و الـ JobSchedualer. اي معرفتك بالدروس السابقه سيكون هذا الدرس سهلاً لك.
  • يحتاج الـ JobDispatcher الى وجود Google Play services مثبت على جهاز المستخدم ليعمل.
  • نظام الاندرويد هو المتحكم في دقة وقت التشغيل, انت تستطيع فقط تحديد نافذة زمنية.
  • يعمل في الخيط الحاسوبي الرئيسي, لذلك من الافضل استخدام احد انماط التصميم للخيوط الحاسوبية (كما جاء في الدروس السابقه) عند اجراء مهمة ثقيله.

 

رابط المكتبة على الـ GitHub

Firebase JobDispatcher Android.


​​​​خطوات انشاء الـ JobDispatcher

  • بما انه مكتبه خارجية سنحتاج الى اضافة الـ Dependencies له في ملف الـ Gradle.
  • ننشئ كلاس جديدة تعمل extends للـ JobService.
  • اظافته الى ملف الـ manifest.xml.

 

الخطوات:

اضافة مكتبة الـ Firebase JobDispatcher الى الـ الـ Dependencies له في ملف الـ Gradle:

implementation 'com.firebase:firebase-jobdispatcher:0.8.5'

 

انشاء كلاس للـ الـ Firebase JobDispatcher:

public class MyJobDispatcher extends JobService {
    @Override
    public boolean onStartJob(final JobParameters job) {
        AppExecutor.getInstance().diskIO().execute(new Runnable() {
            @Override
            public void run() {
                // Our code goes here
                // Our code goes here
                // Our code goes here
                jobFinished(job, false);
            }
        });
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters job) {
        return false;
    }
}

لاحظ التالي:

 

مشابه للسابق اليس كذلك, الفرق الذي يجب عليك الانتباه له هو استخدام مكونات الـ Firebase عندما تعمل import:

import com.firebase.jobdispatcher.JobParameters;
import com.firebase.jobdispatcher.JobService;

 

اضافته الى ملف الـ manifest.xml:

        <service android:name=".task.MyJobDispatcher"
                 android:exported="false">
            <intent-filter>
                <action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
            </intent-filter>
        </service>

نحتاج الى اضافته الى ملف الـ Manifest.xml لإنه عباره عن Service مثل ماجاء في دروسها, مع فرق بسيط كما هو ملاحظ.

 

تجهيز العمل للـ JobDispatcher

والان بعد ان قمنا بإنشاء كلاس خاصة بنا للـ JobDispatcher نحتاج الى انشاء بيانات العمل (في الـ Activity او بإي مكان اخر) ومتى نريده ان يبدأ وكل هذا باستخدام كلاس الـ Job (مشابهه لخطوات الدرس السابق) كالتالي.

 

انتبه الى الـ import:

import com.firebase.jobdispatcher.Constraint;
import com.firebase.jobdispatcher.FirebaseJobDispatcher;
import com.firebase.jobdispatcher.GooglePlayDriver;
import com.firebase.jobdispatcher.Job;
import com.firebase.jobdispatcher.Lifetime;
import com.firebase.jobdispatcher.Trigger;

 

عمل حقل تحديد هل تم جدولة عملنا ام لا, كالتالي:

    private static boolean sIsJobDispatcherInitialized;

 

نعمل دالة وظيفتها بناء العمل وجدولته كالتالي:

    private void firebaseJobDispatcher(){
        if (sIsJobDispatcherInitialized) {
            return;
        }
    ٫٫٫
    ٫٫

لاحظ التالي:

  • لاحظ اذا تم انشاء العمل مسبقاً ستقوم الـ return بالخروج من هذه الدالة (حتى لايحصل تكرار لجدولة العمل).

 

تجهيز عناصر مساعده لتسهيل كتابة الوقت (النافذة الزمنية):

        int INTERVAL_MINUTES = 1;
        int INTERVAL_SECONDS = (int) (TimeUnit.MINUTES.toSeconds(INTERVAL_MINUTES)) ;
        int SYNC_FLEXTIME_SECONDS = INTERVAL_SECONDS;

 

نحتاج لإنشاء عنصر Driver من نوع GooglePlayDriver  لبناء الـ FirebaseJobDispatcher كالتالي:
 

        GooglePlayDriver driver = new GooglePlayDriver(this);
        FirebaseJobDispatcher firebaseJobDispatcher = new FirebaseJobDispatcher(driver);

لاحظ التالي:

  • انشئنا عنصر من واجهة الـ Driver (هذه الكلاس تمثل مكون يفهم جدولة وتنفيذ المهام) وقمنا بعمل init له باستخدام الكلاس GooglePlayDriver (عباره عن polymorphism) هذه الـ GooglePlayDriver تستخدم جنباً الى جنب مع الـ Google Play services واحتجنا لها هنا لإن الـ JobDispatcher قائم على دعم جميع الهواتف التي تأتي الـ Google Play services مثبته فيهم (كسوق جوجل بلاي وماشبه ذلك).

 

نقوم بإنشاء عنصر الـ Job باستخدام العنصر الذي انشئناه سابقاً FirebaseJobDispatcher و تحديد الشروط التي نريدها لتشغيله كالتالي:

        Job ourJob = firebaseJobDispatcher.newJobBuilder()
                .setService(MyJobDispatcher.class)
                .setTag("MY_JOB_TAG")
                .setConstraints(Constraint.DEVICE_CHARGING)
                .setConstraints(Constraint.DEVICE_IDLE)
                .setConstraints(Constraint.ON_ANY_NETWORK)
                .setLifetime(Lifetime.FOREVER)
                .setRecurring(true)
                .setTrigger(
                        Trigger.executionWindow(
                                INTERVAL_SECONDS,
                                INTERVAL_SECONDS + SYNC_FLEXTIME_SECONDS
                        )
                )
                .setReplaceCurrent(true)
                .build();

لاحظ التالي:

  • انشئنا عنصر من كلاس الـ Job وهو الذي سيمثل شرطيات العمل (كما هو الحال مع الـ JobInfo بالدرس السابق).
  • من خلال نمط الـ Builder نستطيع بناء هذا الـ Job. اولاً يجب تحديد الكلاس الذي انشئناها باستخدام الدالة setService ثم وضع له Tag باستخدام الدالة setTag (يقوم بعمل مشابهه للـ ID كما في الدرس السابق, وهنا نحتاجه اذا اردنا ان نلغي او نحدث العمل لاحقاً) ومن ثم الشرطيات.
  • الـ setConstraints القيود او الشرطيات.
  • الـ Constraint.DEVICE_CHARGING نريد من عملنا ان يعمل اذا كان الجهاز في الشاحن.
  • الـ Constraint.DEVICE_IDLE نريد من عملنا ان يعمل اذا كان الجهاز في وضع IDLE.
  • الـ Constraint.ON_ANY_NETWORK نريد من عملنا ان يعمل اذا كان به اتصال انترنت بإي شبكه.
  • الـ setLifetime بها نحدد ان عملنا هذا نريده ان يعمل مدى حياه الهاتف حتى وان اعاد المستخدم التشغيل.
  • الـ setRecurring هنا نحدد هل نريد تكرار عملنا ام مره واحده فقط.
  • الـ setTrigger ونعطيها نافذة زمنيه من خلال الدالة executionWindow بين الدقيقه والدقيقتين (اي ان عملنا هذا سيتكرر كل دقيقه تقريباً).
  • الـ setReplaceCurrent لتحديد اننا نريد تحديدث العمل اذا وجد عمل مشابهه له في الـ Tag.
  • اخيراً قمنا ببنائه بإستخدام build.

 

جدولة العمل مع الـ JobDispatcher

والان بعد ان قمنا بإنشاء كلاس خاصة بنا للـ JobScheduler وايضاً بعد قيامنا بتجهيز العمل يجب علينا جدولة العمل كخطوة نهائية كالتالي:

firebaseJobDispatcher.schedule(ourJob);

 

لتصبح الدالة كاملة بالشكل التالي:

    private void firebaseJobDispatcher(){
        if (sIsJobDispatcherInitialized) {
            return;
        }

        int INTERVAL_MINUTES = 1;
        int INTERVAL_SECONDS = (int) (TimeUnit.MINUTES.toSeconds(INTERVAL_MINUTES)) ;
        int SYNC_FLEXTIME_SECONDS = INTERVAL_SECONDS;

        GooglePlayDriver driver = new GooglePlayDriver(this);
        FirebaseJobDispatcher firebaseJobDispatcher = new FirebaseJobDispatcher(driver);

        Job ourJob = firebaseJobDispatcher.newJobBuilder()
                .setService(MyJobDispatcher.class)
                .setTag("MY_JOB_TAG")
                .setConstraints(Constraint.DEVICE_CHARGING)
                .setConstraints(Constraint.DEVICE_IDLE)
                .setConstraints(Constraint.ON_ANY_NETWORK)
                .setLifetime(Lifetime.FOREVER)
                .setRecurring(true)
                .setTrigger(
                        Trigger.executionWindow(
                                INTERVAL_SECONDS,
                                INTERVAL_SECONDS + SYNC_FLEXTIME_SECONDS
                        )
                )
                .setReplaceCurrent(true)
                .build();

        firebaseJobDispatcher.schedule(ourJob);

        sIsJobDispatcherInitialized = true;
    }

 

الغاء العمل

نستطيع الغاء العمل من خلال استخدام الـ Tag كالتالي:

    private void cancelFirebaseJobDispatcher(){
        GooglePlayDriver driver = new GooglePlayDriver(this);
        FirebaseJobDispatcher firebaseJobDispatcher = new FirebaseJobDispatcher(driver);
        firebaseJobDispatcher.cancel("MY_JOB_TAG");
    }

وهكذا سيكف عملنا عن التشغيل كل دقيقه.

 

في هذا الدرس تعرفنا على الـ FirebaseJobDispatcher وطريقة انشائه واستخدامه, في الدرس القادم سنتعرف على الـ Work Manager.

 

رابط الكلاسات المستخدمه في هذا الدرس

للحصول على رابط المشروع راجع درس المقدمة.
 

المصادر والمراجع

للمزيد راجع درس المقدمة.

 

نهاية الدرس
لاتنسى تتبع الدرس والدورة كذلك لإشعارك عندما يتم التعديل على المتحوى او اضافة المزيد من المعلومات. ايضاً لاتنسى الاعجاب بالدرس ومشاركته مع الاخرين.

المحاضر

Mohammad Laif

محتوى الدورة

تمهيد
1 مقدمة
2 تعرف على التزامن (الـ Concurrency)
3 اخطاء التزامن (الـ Concurrency) الشائعة
العمليات Processes
1 الهيكلة الهندسية لبيئة نظام الاندرويد
2 طبقة الـ Android Runtime و العمليات Processes
3 انواع العمليات (Processes)
الخيوط الحاسوبية Threads
1 الخيوط الحاسوبية (Threads)
2 مكونات الخيوط الحاسوبية (Thread)
3 انشاء الخيط الحاسوبي
أنماط التصميم للخيوط الحاسوبية
1 انشاء نمط الـ Handler و Looper و Thread
2 انشاء نمط الـ HandlerThreads
3 ماهو نمط الـ Thread Pools (الـ Executors)
4 استخدام نمط الـ Thread Pools كـ Singleton
5 استخدام الـ Callable مع نمط الـ Thread Pools
6 انشاء بركة خيوط حاسوبية Thread Pools لتسريع قاعدة البيانات
7 انشاء نمط الـ AsyncTask
8 انشاء نمط الـ Loader
الـ Broadcasts
1 تعرف على الـ Broadcast Receiver
2 انشاء الـ Broadcast Receiver بشكل ثابت
3 انشاء الـ Broadcast Receiver بشكل ديناميكي
4 استخدام الـ Local Broadcast للتخاطب بين المكونات
الـ Services
1 تعرف على الـ Services
2 انشاء الـ Started Service
3 انشاء الـ Intent Service
4 انشاء الـ Bound Service
5 استخدام الـ ResultReceiver للتخاطب مع الـ Intent Service
6 استخدام الـ Broadcast للتخاطب مع الـ Started Service
الـ Alarm Manager
1 تعرف على الـ Alarm Manager
2 طرق استخدام الـ Alarm Manager
الـ Jobs
1 استخدام الـ Android JobSchedualer
2 استخدام الـ Firebase JobDispatcher الدرس الحالي
3 استخدام الـ WorkManager من حزمة JetPack

الكلمات الدليلية

عن الدرس

0 إعجاب
2 متابع
0 مشاركة
1536 مشاهدات
منذ 3 سنوات

التعليقات (1)

manar1984:

الله يعطيك العافية 

جعله الله في ميزان حسناتك 

الخليج لرفع الصور 

 

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !