استخدام الـ Local Broadcast للتخاطب بين المكونات
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
في الدرسين السابقين رأينا طرق انشاء الـ 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 والذي يمتاز بالحماية لإرسال البيانات بين مكونات التطبيق.
رابط الكلاسات المستخدمه في هذا الدرس
- تم استخدام MyLocalReceiver.java في كلاس الـ Main7Activity.
للحصول على رابط المشروع راجع درس المقدمة.
المصادر والمراجع
للمزيد راجع درس المقدمة.
نهاية الدرس
لاتنسى تتبع الدرس والدورة كذلك لإشعارك عندما يتم التعديل على المتحوى او اضافة المزيد من المعلومات. ايضاً لاتنسى الاعجاب بالدرس ومشاركته مع الاخرين.
محتوى الدورة
الكلمات الدليلية
عن الدرس
0 إعجاب |
1 متابع |
0 مشاركة |
1875 مشاهدات |
منذ 5 سنوات |
التعليقات (0)
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !