نظرة على الـ dynamic broadcastReceiver
السلام عليكم ورحمة الله
تكلمت في مقالة سابقة عن عمل الـ BoradcastReceiver بشكل مبسط جدً و كيف يتم إنشاء Static broadcastReceiver
تستطيع العودة اليها من هنأ .
في هذه المقالة سأتكلم عن الـ boradcastReceiver بشي من التفصيل ....
???????????????
نبدأ بسم الله :
لو القينا نظرة عن محتوى التطبيق - مكونات التطبيق - في الأندوريد نجد أنه يكون بهذي الصورة
فتجد إن الـ BroadcastReceiver جزء من محتوى التطبيق - Application component - نحن الأن بصدد شرح المكون الثالث وهو ال BroadcastReceiver
مفهوم الـــ BroadcastReceiver بشكل مبسط هــو عبارة عن ارسال أو استقبال حدث - event - من النظام الى التطبيق او من التطبيق الى تطبيقات أخرى ..
مثلا : اتصال قادم أو الأشعارات عند اكتمال تحميل ملف معين أو الدخول في وضع الطيران أو توفر شبكة وافاي أو انخفاض مستوى البطارية .... الخ
لو أخذنا مثال على الدخول في وضع الطيران ، هنا النظام يرسل تنبيه الى جميع التطبيقات أنه تم الدخول في وضع الطيران ، فإذا كان تطبيقي - يستقبل حدث مثل هذا - نفذ الكود التالي ..
أو في حالة الاتصال - اتصال قادم - هنأ النظام يرسل تنبيه الى جميع التطبيقات أنه يوجد اتصال قادم ...
صورة توضيحية :
???????????????????????????????
ينقسم ال BroadcastReceiver الى أربع أنواع وهــي :
والأكثر استخداماً هي النوعين ال Normal و Ordered
الأن تريد تسجيل حدث - مستقبل - لتطبيقك ، مثل ما ذكرت في المقالة السابقة يمكنك إنشاء حدث جديد بطريقتين :
- الطريقة الأولى وهي الـ statically تكلمت عنها في المقالة السابقة تسطتيع الرجوع إليها من هنأ .
- الطريقة الثانية : هي الـ dynamic يقصد بها تسيجل الحدث برمجيا - programmatically - عن طريق كتابة كود برمجي ، فعند عمل التطبيق يتم تنفيذ أو تسجيل هذا الحدث و عند الخروج من التطبيق لا ينفذ .
من مميزات هذه الطريقة :
- يتم التنفيذ وقت الأستدعاء .
- بعض ال - actions - لا يمكن تنفيذها الا بهذه الطريقة مثل Time_Tick
- إذا كان الـ minSdkVersion 26 - اي اصدار الاندوريد 7 و ما فوق يجب استخدام هذه الطريقة إذا أردت عمل ConnectivityManager
☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕
تعتمد طريقة الـ dynamic أو - Context.registerReceiver على دالتين أساسية وهي :
registerReceiver()
unregisterReceiver()
#/ دالة الــ registerReceiver :
تأخذ هذي الدالة بارامترين :
- أوبجكت من كلاس الــ BroadcastReceiver .
- أوبجكت من كلاس الـ IntentFilter و بداخله يتم تمرير الـ action .
مثلاً :
و دالة الــ unregisterReceiver يمرر لها الاوبجكت من كلاس الــ broadcastReceiver .
#/ السؤال المهم أين يتم كتابة هذي الدالتين ، registerReceiver و unregisterReceiver ؟
- الأفضل أن تُكتب دالة الــ registerReceiver في الــ onResume و تكتب دالة الـ unregisterReceiver في الـ onPause .
- ويمكنك أيضاً كتابة دالة الــ registerReceiver في الـ onCreate و يجب كتابة الـ unregisterReceiver في الـ onDestory .
- ولكن تجنب كتابة دالة الــ unregisterReceiver في الـ onSaveInstanceState لأنه عند الرجوع الى الـ Activity لا يتم تنفيذها .
نأخذ مثال عملي عند التغير الى وضع الطيران :
java Code
Kotlin Code
لاحظ أن عند الخروج من التطبيق لا يتم تنفيذ الـ 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 - تم شرحها هنأ - هل يوجد فرق بين الطريقتين ؟ أترك لنا تعليق يوضح الفرق ؟
والسلام خير ختام .
التعليقات (0)
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !