استخدام الـ Local Broadcast للتخاطب بين المكونات

Mohammad Laifمنذ 5 سنوات

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

 

في الدرسين السابقين رأينا طرق انشاء الـ Broadcast بشكل ثابت وديناميكي. في هذا الدرس سنقوم بإستخدام الـ Local Broadcast للتخطاب بين المكونات في نظام الاندرويد. (يستخدم عادة في التخاطب بين الـ Activity و الـ Service والـ Broadcast Receiver).

 

يعتبر الـ Broadcast Receiver المحلي اكثر اماناً, فهو يعمل ضمن نطاق تطبيقك (اي ان التطبيقات الاخرى لاتستطيع التنصت له) وتكمن افضل استخدام له في تناقل البيانات في تطبيقك. يوجد مثال اخر في درس لاحق حيث سنقوم باستخدام الـ Broadcast العادي للتخاطب بين الـ Service والـ Activity بأستخدام حدث خاص بنا Action لإرسال بيانات في درس متقدم بعنوان: استخدام الـ Broadcast للتخاطب مع الـ Started Service.

 

طريقة عمل الـ Local Broadcast

سنقوم بإنشاء كلاس Receiver مخصصه تقوم بعمل extend للكلاس BroadcastReceiver. ثم سنقوم بتشغيلها وارسال لها بيانات (مجرد رقم واحد int). بداخلها سنقوم بأستلام البيانات واجراء عملية حسابية بسيطة (على ذلك الرقم) ثم ارسال Broadcast محلي بأستخدام الـ LocalBroadcastManager الى تطبيقنا. وفي الـ Activity التي قامت بتشغيل كلاسنا الـ Reciver المخصصه سنقوم بإستقبال هذا الـ Broadcast واستلام النتيجة.

 

تدفق البيانات

  • إرسال البيانات باستخدام Broadcast Receiver من كلاس الـ Activity الى كلاس الـ Local Broadcast.
  • إجراء العملية على البيانات في كلاس  الـ Local Broadcast.
  • إرسال النتيجة من كلاس الـ Local Broadcast الى كلاس الـ Activity بإستخدام الـ LocalbroadcastManager.
  • استلام النتيجة بأستخدام Broadcast Receiver في كلاس الـ Activity.

 

الخطوات

الـ MyLocalReceiver:

  • إنشاء كلاس Broadcast Receiver (بإسم MyLocalReceiver).
  • عمل Override للدالة onReceive وبها الشفرة البرمجية التي ستجري العملية الحسابية.
  • ارسال النتيجة باستخدام الـ Local Broadcast Manager الى الـ Activity.

 

انشاء كلاس الـ MyLocalReceiver:

public class MyLocalReceiver extends BroadcastReceiver {}

 

عمل Override للدالة onReceive وبها الشفرة البرمجية التي ستجري العملية الحسابية:

    @Override
    public void onReceive(Context context, Intent intent) {
        // Get data from the intent that runs this broadcast.
        int number = intent.getIntExtra("number", 0);

        // Calculate
        int result = number * 2;  
    }

 

ارسال النتيجة باستخدام الـ Local Broadcast Manager الى الـ Activity:

    @Override
    public void onReceive(Context context, Intent intent) {
        // Get data from the intent that runs this broadcast.
        int number = intent.getIntExtra("number", 0);

        // Calculate
        int result = number * 2;

        // Create an intent and put result in it, to send it back.
        Intent returningIntent = new Intent();
        intent.putExtra("number", result);

        // Send intent and result back by using Local Broadcast.
        LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
        localBroadcastManager.sendBroadcast(returningIntent);
    }

لاحظ استخدام LocalBroadcastManager لإرسال الـ Intent كـ Broadcast محلي.

 

 

الـ Activity:

  • ننشئ Broadcast Receiver اخر كحقل (بإسم mResultReceiver) بشكل Dynamic (كما جاء في الدرس السابق) لإستقبال البيانات من كلاس الـ MyLocalReceiver بعد معالجتها.
  • ننشئ حقل للـ Local Broadcast Manager (بإسم mLocalBroadcastManager) حتى نقوم بإستخدامه لتسجيل حقل الـ mResultReceiver كـ Local Broadcast.
  • نعمل Init لحقل الـ mLocalBroadcastManager في دالة الـ onCreate.
  • نعمل للحقل mResultReceiver تسجيل بإستخدام الـ Local Broadcast Manager في دالة الـ onResume (في الدرس السابق استخدمنا فقط الدالة registerReceiver).
  • نعمل للحقل mResultReceiver إلغاء التسجيل بإستخدام الـ Local Broadcast Manger في دالة الـ onPause (في الدرس السابق استخدمنا فقط الدالة unregisterReceiver).
  • نرسل البيانات بإستخدام Intent و sendBroadcast الى كلاس الـ MyLocalReceiver.
  • نستقبل البيانات في الـ mResultReceiver.

 

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

    private LocalBroadcastManager mLocalBroadcastManager;
    private BroadcastReceiver mResultReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {

        }
    };

الحقل mLocalBroadcastManager (من نوع LocalBroadcastManager) يسمح لنا بتسجيل الحقل mResultReceiver (من نوع BroadcastReceiver) كـ LocalBroadcast.

 

عمل Init للحقل الـ mLocalBroadcastManager في دالة الـ onCreate:

mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);

 

تسجيل عنصر حقل الـ mResultReceiver كـ Local Broadcast في دالة الـ onResume:

    @Override
    protected void onResume() {
        IntentFilter intentFilter2 = new IntentFilter("my.result.intent");
        mLocalBroadcastManager.registerReceiver(mResultReceiver, intentFilter);
    }

لاحظ قمنا بإستخدام الـ mLocalBroadcastManager لعملية التسجيل من خلال الدالة registerReceiver. اما في الدرس السابق فقمنا بإستخدام الداله مباشرة بدون الـ LocalBroadcastManager.

 

إلغاء التسجيل له في دالة الـ onPause:

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(mMyFirstReceiver);

        // Local Broadcast
        mLocalBroadcastManager.unregisterReceiver(mResultReceiver);
    }

 

نرسل البيانات بإستخدام Intent و sendBroadcast الى كلاس الـ MyLocalReceiver:

Intent intent3 = new Intent(Main7Activity.this, MyLocalReceiver.class);
intent.putExtra("number", 2);
sendBroadcast(intent3);

 

نستقبل نتيجة البيانات في دالة الـ mResultReceiver بحقل الـ mResultReceiver ليصبح كالتالي:

    private BroadcastReceiver mResultReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            int result = intent.getIntExtra("number", 0);
            Log.d(TAG, "onReceive: result ->" + result);
        }
    };

 

في هذا الدرس رأينا طريقة استخدام الـ Local Broadcast والذي يمتاز بالحماية لإرسال البيانات بين مكونات التطبيق.

 

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

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

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

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

 

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

المحاضر

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 مشاركة
1734 مشاهدات
منذ 5 سنوات

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

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

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