آموزش کار با Broadcast Receiver در اندروید: دریافت و پردازش برودکستها
Broadcast Receiver (برودکست رسیور) در اندروید یک قسمت از سیستم عامل است که به برنامهها اجازه میدهد برودکستهایی که توسط سیستم عامل یا برنامههای دیگر ارسال میشوند را دریافت و پردازش کنند.
“ما را در اینستاگرام دنبال کنید”
در این مقاله از سری مقالات برنامه نویسی اندروید اومدیم در مورد Broadcast Receiver در اندروید ، صحبت کنیم. پس با سایت ترولرن همراه باش.
“قبل از شروع مقاله، بگم که بعد از مطالعه این مطلب، از آموزش پروژه محور برنامه نویسی اندروید سایتمون یعنی دوره ژنرال اندروید غافل نشید.”
Broadcast Receiver(برودکست رسیور)
Broadcast Receiver (برودکست رسیور) پیامهایی هستند که بین اجزاء مختلف سیستم یا برنامهها منتقل میشوند و میتوانند شامل رویدادهایی مانند رسیدن یک تماس تلفنی، دریافت پیامک، شارژ کامل باتری، یا تغییر وضعیت شبکه باشند.
برای استفاده از برودکست رسیور در اندروید، ابتدا باید یک کلاس ایجاد کنید که از کلاس BroadcastReceiver ارثبری کند. سپس باید فانکشن onReceive() را پیادهسازی کنید که در آن برودکستها دریافت و پردازش میشوند. در این روش، شما میتوانید براساس نوع برودکست و دادههای مربوطه که در این برودکست ارسال شده است، عملیات مورد نیاز خود را انجام دهید.
برای ثبت برودکست رسیور و مشخص کردن برودکستهایی که میخواهید دریافت کنید، میتوانید از دو روش استفاده کنید. یکی استفاده از فیلتر اکشنها (Action Filters) است، که خود یک رشته است که برای شناسایی نوع برودکست استفاده میشود. دیگری استفاده از فیلتر اینتنتها (Intent Filters) است که بر اساس اطلاعاتی مانند نام بسته، نام کامپوننت، دسته بندیها و متادیتاها مربوط به یک برودکست، آن را شناسایی میکند.
انواع Broadcast Receiver ها و داده هایی که میتواند دریافت کند
در اندروید، Broadcast Receiver (برودکست رسیور) میتوانند به انواع مختلفی از برودکستها و دادهها پاسخ دهند. با استفاده از کاتلین، میتوانید برودکست رسیورهایی را تعریف کنید که به انواع زیر پاسخ میدهند:
برودکستهای سیستمی (System Broadcasts)
ACTION_BOOT_COMPLETED: وقتی سیستم بالا میآید.
ACTION_SHUTDOWN: وقتی سیستم در حال خاموش شدن است.
ACTION_POWER_CONNECTED: وقتی دستگاه به برق وصل میشود.
ACTION_POWER_DISCONNECTED: وقتی دستگاه از برق جدا میشود.
ACTION_BATTERY_LOW: وقتی سطح باتری به حداقل مجاز میرسد.
ACTION_BATTERY_OKAY: وقتی سطح باتری به حالت عادی برمیگردد.
و غیره…
برودکستهای شبکه (Network Broadcasts)
CONNECTIVITY_ACTION: وقتی وضعیت اتصال شبکه تغییر میکند.
WIFI_STATE_CHANGED_ACTION: وقتی وضعیت Wi-Fi تغییر میکند.
WIFI_P2P_STATE_CHANGED_ACTION: وقتی وضعیت Wi-Fi Direct تغییر میکند.
و غیره…
برودکستهای تماس (Telephony Broadcasts)
ACTION_PHONE_STATE_CHANGED: وقتی وضعیت تلفن تغییر میکند (به عنوان مثال، تماس ورودی دریافت میشود).
ACTION_NEW_OUTGOING_CALL: وقتی یک تماس خروجی شروع میشود.
و غیره…
برودکستهای ارسالی توسط برنامهها (Custom Broadcasts)
برنامهها میتوانند برودکستهای سفارشی خود را تعریف کنند و آنها را ارسال کنند. برای مثال:
“com.example.myapp.ACTION_CUSTOM_EVENT”: برای رویدادهای سفارشی در برنامه شما.
برای دسترسی به دادههای مربوط به برودکستها، شما میتوانید از پارامتر Intent استفاده کنید که در فانکشن onReceive() برودکست رسیور دریافت میشود. این Intent شامل اطلاعاتی مانند اکشن برودکست، دادههای اضافی (Extras)، و برخی ویژگیهای دیگر است. با استفاده از Intent، میتوانید به دادههای مربوطه دسترسی پیدا کنید و عملیات مورد نیاز خود را انجام دهید.
چند مثال کاربردی
برای مثال، در یک برودکست رسیور که به برودکست “android.intent.action.BATTERY_LOW” پاسخ میدهد، شما میتوانید به صورت زیر دادههای مربوط به سطح باتری را دریافت کنید:
class MyBroadcastReceiver : BroadcastReceiver() { overridefun onReceive(context: Context, intent: Intent) { if (intent.action == Intent.ACTION_BATTERY_LOW) { val batteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0) val batteryScale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100) val batteryPercentage = batteryLevel * 100 / batteryScale // انجام عملیات مورد نیاز با دادههای دریافتی // مثلاً نمایش هشدار باتری کم } } }
در مثال فوق، ما از دادههای اضافی Intent استفاده کردهایم. با استفاده از getIntExtra()، ما سطح باتری را دریافت کرده و با استفاده از آن و مقیاس باتری، درصد باتری را محاسبه کردهایم.
با توجه به نوع برودکست و دادههای مورد نیاز خود، شما میتوانید منطق و عملیات دلخواه خود را در فانکشن onReceive() برودکست رسیور پیادهسازی کنید.
برای برودکستهای شبکه (Network Broadcasts)
class NetworkChangeReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.action == ConnectivityManager.CONNECTIVITY_ACTION) { val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val networkInfo = connectivityManager.activeNetworkInfo val isConnected = networkInfo?.isConnectedOrConnecting == true // انجام عملیات مورد نیاز با دادههای دریافتی // مثلاً نمایش وضعیت اتصال به اینترنت } } }
در مثال بالا، با استفاده از ConnectivityManager و activeNetworkInfo، ما وضعیت اتصال به اینترنت را دریافت کردهایم.
برای برودکستهای تماس (Telephony Broadcasts)
class PhoneStateReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.action == TelephonyManager.ACTION_PHONE_STATE_CHANGED) { val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager val state = telephonyManager.callState // انجام عملیات مورد نیاز با دادههای دریافتی // مثلاً نمایش وضعیت تماس (درحال تماس، درحال زنگ خوردن و غیره) } } }
در مثال بالا، با استفاده از TelephonyManager و callState، ما وضعیت تماس را دریافت کردهایم.
برای برودکستهای سفارشی (Custom Broadcasts)
class CustomBroadcastReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.action == "com.example.myapp.ACTION_CUSTOM_EVENT") { val customData = intent.getStringExtra("extra_data") // انجام عملیات مورد نیاز با دادههای دریافتی // مثلاً نمایش پیام سفارشی در برنامه شما } } }
در مثال بالا، ما یک برودکست سفارشی با اکشن “com.example.myapp.ACTION_CUSTOM_EVENT” تعریف کردیم و دادههای اضافی با کلید “extra_data” را دریافت کردیم.
با استفاده از این مثالها میتوانید برودکست رسیورهایی را پیادهسازی کنید که به انواع برودکستها و دادههای مربوطه در اندروید پاسخ دهند. لازم به ذکر است که در هر برودکست رسیور، شما میتوانید منطق و عملیات دلخواه خود را در فانکشن onReceive() برنامهریزی کنید.
نحوه کار با Broadcast Receiver
برای کار با Broadcast Receiver در اندروید و در زبان کاتلین، شما باید مراحل زیر را دنبال کنید:
تعریف Broadcast Receiver
شما باید یک کلاس ایجاد کنید که از کلاس BroadcastReceiver ارثبری کند.
در این کلاس، شما باید فانکشن onReceive() را override کنید. این روش برای پردازش برودکست و دریافت دادههای مربوطه استفاده میشود.
ثبت Broadcast Receiver
شما باید Broadcast Receiver خود را در برنامه خود ثبت کنید تا بتوانید برودکستهای مورد نظر را دریافت کنید.
شما میتوانید Broadcast Receiver را به دو صورت ثبت کنید: در کد برنامه (dynamically) یا در فایل منتظرها (manifest) برنامه.
برای ثبت در کد برنامه، شما باید یک شیء از Broadcast Receiver بسازید و از Context برنامه استفاده کنید تا آن را ثبت کنید.
برای ثبت در فایل منتظرها (manifest) برنامه، شما باید فایل AndroidManifest.xml را ویرایش کنید و در بخش <application>، یک المان <receiver> برای Broadcast Receiver خود اضافه کنید.
پردازش برودکست
در فانکشن onReceive() Broadcast Receiver، شما میتوانید به دادههای مربوطه دسترسی پیدا کنید و عملیات مورد نیاز خود را انجام دهید.
برای دسترسی به دادههای مربوطه، شما میتوانید از پارامتر Intent استفاده کنید که در فانکشن onReceive() دریافت میشود.
با استفاده از Intent، میتوانید به دادههای اضافی (Extras) و سایر ویژگیهای Intent دسترسی پیدا کنید.
یک مثال ساده برای نحوه کار با Broadcast Receiver
class MyBroadcastReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.action == "com.example.myapp.MY_CUSTOM_ACTION") { // دریافت دادههای اضافی از Intent val extraData = intent.getStringExtra("extra_data") // انجام عملیات مورد نیاز با دادههای دریافتی Log.d("BroadcastReceiver", "Received data: $extraData") } } }
برای ثبت Broadcast Receiver در کد برنامه، میتوانید از روش زیر استفاده کنید:
val receiver = MyBroadcastReceiver() val filter = IntentFilter("com.example.myapp.MY_CUSTOM_ACTION") context.registerReceiver(receiver, filter)
در مثال بالا، ما یک شیء از Broadcast Receiver ساخته و آن را با استفاده از Context برنامه و IntentFilter ثبت کردهایم. این Broadcast Receiver برای برودکست با اکشن “com.example.myapp.MY_CUSTOM_ACTION” فعال خواهد شد.
لازم به ذکراست که در صورت ثبت Broadcast Receiver در کد برنامه، شما باید آن را همانند هر منبع دیگری که ثبت میکنید، درست قبل از استفاده از آن، آن را آزاد کنید (unregister) تا منابع سیستم را آزاد کنید.
همچنین، برای ثبت Broadcast Receiver در فایل منتظرها (manifest) برنامه، شما باید فایل AndroidManifest.xml را ویرایش کنید و الگوی زیر را به آن اضافه کنید:
<receiver android:name=".MyBroadcastReceiver"> <intent-filter> <action android:name="com.example.myapp.MY_CUSTOM_ACTION" /> </intent-filter> </receiver>
در مثال بالا، ما یک المان <receiver> اضافه کردهایم که Broadcast Receiver ما را تعریف میکند. با اضافه کردن المان <intent-filter> و عملکرد <action> درون آن، ما برودکست را با اکشن “com.example.myapp.MY_CUSTOM_ACTION” مشخص کردهایم.
با پیادهسازی این مراحل، شما میتوانید با Broadcast Receiver در اندروید و با استفاده از کاتلین، برودکستهای مورد نظر را دریافت و عملیات مربوطه را انجام دهید.
حرف آخر
در اینجا، شما با نحوه کار با Broadcast Receiver در اندروید با استفاده از زبان کاتلین آشنا شدید. برودکست رسیور اجازه میدهد تا برنامهها اعلانها و برودکستها را دریافت کنند و بر اساس آنها عملیات مربوطه را انجام دهند.
شما با تعریف یک کلاس Broadcast Receiver و Override کردن فانکشن onReceive()، میتوانید برودکستهای مختلف را پردازش کنید. با استفاده از Intent و دادههای اضافی (Extras) آن، میتوانید به دادههای دریافتی دسترسی پیدا کنید و عملیات مورد نیاز را انجام دهید.
همچنین، شما میتوانید برودکست رسیور خود را به دو صورت ثبت کنید: در کد برنامه (dynamically) و در فایل منتظرها (manifest) برنامه. با ثبت Broadcast Receiver، شما میتوانید برودکستهای مورد نظر را دریافت کنید و عملیات مربوطه را انجام دهید.
استفاده از Broadcast Receiver در اندروید، به شما امکان میدهد تا برنامههای خود را با اطلاعات و رویدادهای سیستمی هماهنگ کنید و به آنها واکنش نشان دهید. این قابلیت میتواند در انواع سناریوهای مفیدی مانند پیشرفت وضعیت شبکه، تغییرات در وضعیت تلفن و دریافت پیامهای سفارشی استفاده شود.
با استفاده از مثالها و راهنماییهایی که در پاسخ قبلی ارائه شد، شما میتوانید برودکست رسیور خود را پیادهسازی کرده و به منظور دریافت و پردازش برودکستهای مورد نظر در برنامه خود اقدام کنید.
و همچنین ممنون میشم از طریق ستارههای این پایین به این مقاله امتیاز بدی و اگه هر سوالی داشتی توی قسمت دیدگاه بپرس و قطعا بهت پاسخ میدیم.
دیدگاهتان را بنویسید