استخدام الـ ResultReceiver للتخاطب مع الـ Intent Service

Mohammad Laifمنذ 3 سنوات

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

 

في الدرس السابق رأينا كيف ان الـ Bound Service ترسل النتائج مع المكون الملتصق بها. في هذا الدرس سنرى كيفية ارسال النتائج من الـ Intent Service (تستطيع استخدام هذه الطريقه مع الـ Started Service كذلك) بواسطة الـ ResultReceiver واستقبالها في الـ Activity لإستخدام النتيجه لتحديث الـ Views. قبل هذا كله ربما تريد مراجعة الدرس: انشاء الـ Intent Service.

 

في كلاس الـ Actiivty:

  • سنقوم بانشاء كلاس داخلية ResultReceiver في الـ Activity لإستقبال البيانات المرسله من الـ Intent Service.
  • نرسل هذا الـ ResultReceiver الى الـ Service بواسطة Intent عند تشغيلها.
  • نعمل override للداله onReceiveResult. وفيها نستقبل الـ Bundle بحسب Code للمهمه ونستخرج بيانات النتائج من الـ Bundle, ثم نقوم باستخدام الـ Handler لتحديث الـ TextView.
  • ننشئ حقل للـ View هنا سوف تكون TextView.
  • ننشئ حقل من نوع Handler الذي من خلاله نستقبل الـ Bundle من الـ Service ثم نقوم بتحديث الـ TextView بداخله لاحقاً.

 

انشاء كلاس الـ ResultReceiver

    private class MyIntentServiceResultReceiver extends ResultReceiver {

        public MyIntentServiceResultReceiver(Handler handler) {
            super(handler);
        }

    }

 

نعمل override للداله onReceiveResult (لإستقبال بيانات النتائج) لتصبح كلاس الـ ResultReceiver على هذا الشكل:

    private class MyIntentServiceResultReceiver extends ResultReceiver {

        public MyIntentServiceResultReceiver(Handler handler) {
            super(handler);
        }

        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
            super.onReceiveResult(resultCode, resultData);

            if (resultCode == 88 && resultData != null) {
                final String result = resultData.getString(Constant.RESULT_NUMBER);
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mResultTextView.setText(result);
                    }
                });

            }

        }

    }

لاحظ في دالة الـ onReceiveResult قمنا باستقبال الـ Bundle بحسب Code للمهمه وهو ٨٨, ثم قمنا باستخراج بيانات النتائج من الـ Bundle, بعد ذلك قمنا باستخدام الـ Handler لتحديث الـ TextView. لماذا Handler؟ بسبب ان الدالة onReceiveResult تعمل على خيط حاسوبي مختلف عن الخيط الرئيسي (تعمل على خيط الـ IntentService) وعنصر الـ TextView لانستطيع تحديثه الا في الخيط الرئيسي لذلك قمنا باستخدام Handler ليحل الوضع فهو يعتبر حلقه وصل بين الخيوط.

 

انشاء الحقول:

private TextView mResultTextView;
private Handler mHandler = new Handler();

 

نرسل هذا الـ ResultReceiver الى الـ Service بواسطة Intent عند تشغيلها.

ResultReceiver resultReceiver = new MyIntentServiceResultReceiver(null);
intent.putExtra(Constant.RECEIVE_RESULT_KEY, resultReceiver);
startService(intent);

 

طريقة ارسال النتائج من الـ Service الى الـ Activity
في كلاس الـ Service:

  • في دالة الـ onHandleIntent نستقبل الـ Intent ونستخرج منها ResultReceiver (الذي سوف ننشئه لاحقاً في الـ Activity).
  • نغلف النتيجه في Bundle ثم نرسل هذا الـ Bundle باستخدام الـ ResultReceiver.


الخطوات:
بعد الانتهاء من حساب النتيجه نستخرج الـ ResultReceiver من الـ Intent التي قامت بتشغيل هذه الـ Service ونغلف النتيجه في Bundle ونرسلها عبر الـ ResultReceiver:

ResultReceiver resultReceiver = intent.getParcelableExtra(Constant.RECEIVE_RESULT_KEY);
Bundle bundle = new Bundle();
bundle.putString(Constant.RESULT_NUMBER, String.valueOf(resultNumber) + " - From IntentService");
resultReceiver.send(88, bundle);    // 88 our code for this task

لاحظ استخدام الرقم ٨٨ كـ Code لهذه المهمه.

 

في هذا الدرس رأينا طريقة ارسال البيانات من الـ Intent Service الى الـ Activity بواسطة الـ ResultReceiver وذلك من خلال تغليفه وارساله مع الـ Intent التي تشغل الخدمة Intent Service ثم استقبلناه من خلال عمل Override للدالة onReceiveResult.

 

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

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

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

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

 

 

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

المحاضر

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 إعجاب
1 متابع
0 مشاركة
1037 مشاهدات
منذ 3 سنوات

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

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

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