عمل BroadcastReceiver

abdulrahman-abdullahمنذ 7 سنوات

 أهلا وسهلاً بكم في لمحة مبسطة عن الــ 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> 

 النتيجة : 

Screenshot_1507322068.thumb.png.21fc2739ed7156f6814772db4f18c911.png

 

 

 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 . 

 

دمتم بخير . 

 

كلمات دليلية:
2
إعجاب
3799
مشاهدات
0
مشاركة
0
متابع
متميز
محتوى رهيب

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

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

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