عمل BroadcastReceiver
أهلا وسهلاً بكم في لمحة مبسطة عن الــ BroadcastReceiver ، سأتكلم في هذي المقالة عن تعريف الـ BroadcastReceiver و طريقة اضافتها لبرنامجك ..
تنويه : اللغة المستخدمة في الشرح هي kotlin
ماهو BroadcastReceiver ؟
هو عبارة عن أرسال و استقبال بين البرنامج و النظام ، عند حدوث event معين يكون معرف مسبقا في النظام او يتم تعريفه من قبل المبرمج .
في البداية دعنا نلقي نظرة على المعرفة مسبقا في النظام - بعض منها :
Battery Low WI-Fi connected BATTERY_OKAY Incomming SMS AIRPLANE_MODE BATTERY_CHANGED ACTION_POWER_CONNECTED
الأن عندما تريد إنشاء حدث معين أنت أمام خيارين هما :
statically BroadcastReceiver *
هو اضافة حدث في ملف الـــ AndroidMainfest.xml
أو
Dynamic BroadcastReceiver *
تسجيل الحدث بإستخدام ال جافا / الكوتلين داخل ال activity .
ملاحظة :
ال BroadcastReceiver لا يقبل عمليات تاخذ وقت في تنفيذها مثل استخرج بيانات أو ارسال بيانات او عمل مؤقت .... الخ ، لانه يعمل في ال main thread .
لنأخذ مثال بسيطا لعمل برنامج يظهر نص عند الضغط على الزر بإستخدام الــ statically BroadcastReceiver :
في البداية دعنا ننشي كلاس يظهر لي رسالة عند ضعط المستخدم على الزر وليكن اسم هذا الكلاس : MybroadcastReceiver
class MybroadcastReceiver:BroadcastReceiver() {
override fun onReceive(p0: Context?, p1: Intent?) {
Toast.makeText(p0!!," Hello form First receiver ",Toast.LENGTH_LONG).show()
}
}
الان ننتقل الى كلاس ال MainActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// send receiver when clicked button
btn_sendReceiver.setOnClickListener({
// declared intent and pass MybroadcastReceiver ...
var intent = Intent(this,MybroadcastReceiver::class.java)
sendBroadcast(intent)
})
}
الأن في ملف ال AndroidMainfest.xml نقوم بتسجل هذا الحدث :
// After activity tag ..
<receiver android:name=".MybroadcastReceiver">
</receiver>
النتيجة :
Pesudo Code 1 - craete subClass extends BroadcastReceiver . 2 -override the onReceiver method . 3- add receiver on AndroidMainfest.xml 4 - create event to send data . 5 - declaerd intent . 6 - sendBroadcastReceiver(intent) .
#### عمل ( InnerClass BroadcastReceiver )
بنفس عمل الآلية السابقة ، نحتاج الى كلاس يراث من broadcastReceiver و أكشن يشير الى هذا الكلاس ...
هذي المرة سأقوم بتعريف كلاس داخلي يشير الى الأكشن ..
MainActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// send receiver when clicked button
btn_sendReceiver.setOnClickListener({
// declared intent and put action ...
var intent = Intent("send.msg.receiver")
sendBroadcast(intent)
})
}
/***** Start InnerClass **************/
public class MybroadcastInner:BroadcastReceiver(){
override fun onReceive(p0: Context?, p1: Intent?) {
Toast.makeText(p0!!," Hello form InnerReceiver receiver ",Toast.LENGTH_LONG).show()
}
}
/***** End InnerClass **************/
}
لاحظ انه تم تمرير اكشن - action - في ال intent ، هذا الاكشن سيتم تعريفه في ملف الــ AndroidMainfest.xml
ملاحظة :
عند كتابة الكود بالجافا تحتاج الى اضافة كلمة static قبل اسم الكلاس الداخلي مثلا :
public static class MybroadcastInner extends BroadcastReceiver{}
ملف ال AndroidMainfest.xml :
// After activity Tag .
<receiver android:name=".MainActivity$MybroadcastInner">
<intent-filter>
<action android:name="send.msg.receiver"/>
</intent-filter>
</receiver>
لاحظ انه تم تعريف الكلاس الاساسي ثم تم وضع علامة ( $) قبل اسم الكلاس الداخلي لكي يتمكن ملف الاندرويد من التعرف على الكلاس الداخلي
ثم بعد ذلك تم إنشاء intent-filter بداخله اكشن - action -
لاحظ ان اسم الاكشن هو نفس الاسم الذي تم تمريره لل intent .
فعند التنفيذ ستظهر نفس النتيجة .
في هذا الجزء تم التعرف على كتابة كلاس داخلي ، و الوصول له من خلال ملف AndroidMainfest.xml
تنويه : يمكنك تمرير أكشن الى الــ Intent حتى لو كان ال BroadcastReceiver في كلاس منفصل ، مثل ما عملنا في الجزء السابق .
في المقالة القادمة ، سأتحدث عن Dynamic BroadcastReceiver .
دمتم بخير .
التعليقات (0)
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !