نظرة على الـ dynamic broadcastReceiver

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

السلام عليكم ورحمة الله 
تكلمت في مقالة سابقة عن عمل الـ BoradcastReceiver بشكل مبسط جدً و كيف يتم إنشاء Static broadcastReceiver 
تستطيع العودة اليها من هنأ . 
في هذه المقالة سأتكلم عن الـ boradcastReceiver بشي من التفصيل .... 

???????????????

 

نبدأ بسم الله :  

لو القينا نظرة عن محتوى التطبيق - مكونات التطبيق - في الأندوريد نجد أنه يكون بهذي الصورة 

 

android-components.thumb.PNG.fba5725b403950ded4ec83d1d8a6d398.PNG

 

فتجد إن الـ BroadcastReceiver جزء من محتوى التطبيق - Application component -  نحن الأن بصدد شرح المكون الثالث وهو ال BroadcastReceiver  

مفهوم الـــ BroadcastReceiver بشكل مبسط هــو عبارة عن ارسال أو استقبال حدث - event -  من النظام الى التطبيق او من التطبيق الى تطبيقات أخرى ..  


مثلا : اتصال قادم أو الأشعارات عند اكتمال تحميل ملف معين أو الدخول في وضع الطيران أو توفر شبكة وافاي أو انخفاض مستوى البطارية .... الخ

 
لو أخذنا مثال على الدخول في وضع الطيران ، هنا النظام يرسل تنبيه الى جميع التطبيقات أنه تم الدخول في وضع الطيران ، فإذا كان تطبيقي - يستقبل حدث مثل هذا - نفذ الكود التالي ..

 

أو في حالة الاتصال - اتصال قادم - هنأ النظام يرسل تنبيه الى جميع التطبيقات أنه يوجد اتصال قادم ... 

صورة توضيحية : 

broadcastReceivre-howWork.thumb.PNG.a6786bdc6c07ecd71b6839e3cc92ae36.PNG

 

???????????????????????????????

 

ينقسم ال BroadcastReceiver الى أربع أنواع وهــي : 

types-broadcast.thumb.PNG.9d980eec2ec08a61f4b8d7616836dc6d.PNG

 

والأكثر استخداماً هي النوعين ال Normal  و  Ordered 

الأن تريد تسجيل حدث - مستقبل - لتطبيقك ، مثل ما ذكرت في المقالة السابقة يمكنك إنشاء حدث جديد بطريقتين : 

  1. الطريقة الأولى وهي الـ statically تكلمت عنها في المقالة السابقة تسطتيع الرجوع إليها من هنأ
  2. الطريقة الثانية : هي الـ dynamic يقصد بها تسيجل الحدث برمجيا - programmatically -  عن طريق كتابة كود برمجي ، فعند عمل التطبيق يتم تنفيذ أو تسجيل هذا الحدث و عند الخروج من التطبيق لا ينفذ . 

 

من مميزات هذه الطريقة : 

  • يتم التنفيذ وقت الأستدعاء . 
  • بعض ال - actions - لا يمكن تنفيذها الا بهذه الطريقة مثل Time_Tick 
  • إذا كان الـ minSdkVersion 26 - اي اصدار الاندوريد 7 و ما فوق يجب استخدام هذه الطريقة إذا أردت عمل ConnectivityManager  

 

☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕

 

تعتمد طريقة الـ dynamic  أو - Context.registerReceiver على دالتين أساسية وهي : 


registerReceiver() 
unregisterReceiver() 

 

#/ دالة الــ registerReceiver  : 

تأخذ هذي الدالة بارامترين

  • أوبجكت من كلاس الــ BroadcastReceiver .
  • أوبجكت من كلاس الـ IntentFilter و بداخله يتم تمرير الـ action .

مثلاً : 

dynaminc_receiver_after_edit.thumb.jpg.4be9b641419a19dcf37a5c8cdcbfc539.jpg

 

و دالة الــ unregisterReceiver يمرر لها الاوبجكت من كلاس الــ broadcastReceiver .

 

#/ السؤال المهم  أين يتم كتابة هذي الدالتين ، registerReceiver و unregisterReceiver  ؟ 

  • الأفضل أن تُكتب دالة الــ registerReceiver في الــ onResume  و  تكتب دالة الـ unregisterReceiver في الـ onPause
  • ويمكنك أيضاً كتابة دالة الــ registerReceiver في الـ onCreate و  يجب كتابة الـ unregisterReceiver في الـ onDestory .
  • ولكن  تجنب كتابة دالة الــ unregisterReceiver في الـ onSaveInstanceState  لأنه عند الرجوع الى الـ Activity لا يتم تنفيذها

 

نأخذ مثال عملي عند التغير الى وضع الطيران :

java Code 

example_dynaimc_receiver.thumb.PNG.d282f85331d6a6027a6a0d9db979b1ae.PNG

 

Kotlin Code 

example_dynaimc_receiver_kotlin.thumb.PNG.81bcd679e3852c7ba0c9a785ba3acb86.PNG

 

 

dynamic-result.thumb.png.b7afef501d71186aa586680b3c6b0fea.pngdynamic-result-2.thumb.png.746fa5f7b635d2a6a5b408ca11731640.png

 

لاحظ أن عند الخروج من التطبيق لا يتم تنفيذ الـ receiver 

ما تم عمله التالــي : 

  • إنشاء اوبجكت - object - من كلاس الـ BroadcastReceiver . 
  • في داخل دالة الــ onReceive  ، تظهر رسالة بدخول في وضع الطيران أو الخروج منه . 
  • في دالة الــ onResume  ، انشائنا أوبجكت من كلاس الــ IntentFilter و تم تمرير الـ Action الى هذا الاوبجكت وهــو Intent.Action_AIRPLANE_MODE_CHANGED .

<<  بالمناسبة تستطيع مشاهدة   جميع الــ actions الموجودة في النظام من ملف الــ broadcast_action.txt الموجود في المسار التالي : 
<< SDK-> platform->android-${api level} -> data -> broadcast_action.txt 

 

  •  تم تسجيل الــ receiver من خلال دالة الـ registerReceiver وكذلك مررنا لها الـ receiver و ايضا الـ mIntent 
  •  أخيرأ في الـ onPause كتابنا دالة إلغاء المستقبل - إن صح التعبير - و مررنا لها الـ receiver .

 

⚠️ ملاحظة مهمة جداً : 

يجب كتابة دالة الــ unregisterReceiver  في حال لم تقم بكتابتها سيظهر خطأ الـ Leaked Intent  فيحدث أغلاق مفاجى للتطبيق أو  يبدأ التطبيق في استهلاك البطارية . 

 

?️  تمرين :

حاول تطبيق الكود السابق بطريقة الـ  statically BoradcastReceiver - تم شرحها هنأ - هل يوجد فرق بين الطريقتين ؟ أترك لنا تعليق يوضح الفرق ؟ 

 

والسلام خير ختام . 

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

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

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

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