مفهوم و جایگاه BroadCast Receiver در اکوسیستم اندروید
سیستمعامل اندروید مبتنی بر معماری رویداد محور (Event-Driven) طراحی شده است؛ به این معنا که رویدادهای سیستمی و تغییرات وضعیت دستگاه همواره در قالب پیام های همگانی (Broadcasts) در سطح سیستم توزیع میشوند. کامپوننت BroadCast Receiver (برودکست رسیور) یکی از ۴ ستون اصلی سیستمعامل اندروید در کنار Activity، Service و Content Provider است که وظیفه دارد این رویدادها را شنود کرده و برنامه را از رخدادهای مهم محیطی مطلع سازد.
از جمله رویدادهای رایجی که توسط برودکست رسیور مدیریت میشوند میتوان به تغییر وضعیت اتصال اینترنت، تغییر سطح شارژ باتری، حالت هواپیما (Airplane Mode)، متصل شدن شارژر یا حتی دریافت پیامک اشاره کرد. تسلط بر نحوه ثبت، مدیریت و بهینه سازی مصرف منابع در این کامپوننت، یکی از سرفصل های کلیدی در آموزش برنامه نویسی اندروید به شمار میرود؛ چرا که اجرای غیراصولی برودکست ها میتواند به سرعت شارژ باتری کاربر را تخلیه کرده و توسط مکانیسم های امنیتی اندروید محدود شود.
رسیورهای استاتیک در برابر رسیورهای داینامیک
در توسعه اپلیکیشن با جاوا، دو شیوه اصلی برای پیاده سازی و ثبت برودکست رسیور وجود دارد که درک تفاوت آنها نقش اساسی در طراحی درست پروژه ایفا میکند:
- ثبت استاتیک در AndroidManifest.xml: در این روش، رسیور در فایل پیکربندی پروژه تعریف میشود و حتی اگر برنامه شما در حال اجرا نباشد، به محض رخ دادن رویداد سیستمی، اپلیکیشن بیدار شده و متد
onReceiveاجرا میشود. با توجه به استانداردهای آموزش معماری تمیز در اندروید، استفاده از رسیورهای استاتیک تنها باید برای رویدادهای حیاتی که مجوز صریح دارند محدود گردد. - ثبت داینامیک درون کد (Dynamic Registration): در این متد، رسیور درون چرخهی حیات اکتیویتی یا فرگمنت با متد
registerReceiverفعال شده و در متد متناظر مثلonStopیاonDestroyحتماً باunregisterReceiverآزاد میشود. این رویکرد مانع از نشت حافظه (Memory Leak) شده و بر اساس اصول آموزش پروفایلینگ در اندروید و بهینه سازی مصرف رم، پایداری عملکرد اپ را تضمین میکند.
اصول اجرای کدهای سبک در متد onReceive
یکی از مهمترین چالش های برنامه نویسان در کار با BroadCast Receiver، مواجهه با خطای وحشتناک ANR (Application Not Responding) است. سیستمعامل اندروید به متد onReceive اجازه نمیدهد که بیشتر از چند ثانیه روی Thread اصلی (Main Thread) منابع پردازنده را اشغال کند.
بنابراین، اگر نیازمند انجام عملیات سنگین نظیر دانلود فایل، خواندن داده از شبکه یا محاسبات پیچیده هستید، هرگز نباید آنها را به صورت مستقیم در بدنه رسیور قرار دهید. در چنین شرایطی، رسیور صرفاً وظیفه دارد با راهاندازی تسک های پس زمینه با آموزش ورک منیجر WorkManager در اندروید یا ارسال پیام به لایه دیتای برنامه، بار پردازشی را به پسزمینه هدایت نماید. در پروژه هایی تیمی، مدیریت و نگه داری این لاجیک ها با ابزار های کنترل نسخه نظیر سیستم کنترل نسخه گیت انجام میپذیرد تا خطاهای همزمانی به حداقل برسند.
امتیاز و نظرات
هنوز نظری ثبت نشده است. اولین نفر باشید.