آموزش کامل Broadcast Receiver در اندروید
یکی دیگر از مواردی که در برنامه نویسی اندروید ممکن است به شدت به آن نیاز داشته باشیم، استفاده از Broadcast Receiver میباشد. این نیاز ممکن است به گونهای باشد که حتی هستهی اصلی برنامه را وابسته به استفاده از Broadcast Receiver کند. اما این Broadcast Receiver ها چه هستند؟!
بهتر است قبل از اینکه این پست را بخوانید، ابتدا پست Intent ها را مطالعه کنید.
Broadcast Receiver چیه دیگه؟
در یک کلام ساده، میتوان لقب فالگوش را بر روی آن گذاشت اما بهتر است کمی این لقب را بازتر کنیم.
Broadcast Receiver به معنی گیرندهی پخش و از آنجایی که لقب فالگوش را بر روی آن نهادیم، باید به چیزی گوش فرا دهد. این گوش فرادادن به چیزی بدین جهت است که در زمان روی دادن آن اتفاق، فرایندی اجرا شود.
سیستم عامل اندروید، اتفاقاتی که در سطح سیستم روی میدهند را با استفاده از Broadcast اعلام میکند و هر نرمافزاری که یک Receiver برای این Broadcast تعریف کرده باشد، هنگام رخ دادن آن، برنامه باخبر میشود.
حالا مثلا چه اتفاقاتی با Broasdcast اعلام میشن؟
- زمانی که گوشی بوت شده و دوباره راهاندازی میشود، اکشن Intent.ACTION_BOOT_COMPLETED اتفاق میافتد.
- زمانی که خطای باتری کم است اعلام میشود، اکشن Intent.ACTION_BATTERY_LOW اتفاق میافتد.
- زمانی که اس ام اسی دریافت میشود، اکشنهای مربوط به اس ام اس اتفاق میافتد که به خاطر زیاد بودن بیان نمیکنم.
- و …
نکته: برخی از Broadcast ها نیاز به Permission های خاصی دارند، مثل بوت شدن که به دسترسی android.permission.RECEIVE_BOOT_COMPLETED نیاز دارد.
نکته: رسیورهایی که تعریف میکنیم، تحت هرشرایطی، چه برنامه باز باشد و چه بسته، وقتی رویداد مورد نظر اتفاق بیفتد، اجرا خواهند شد.
لیست اکشنها رو از کجا پیدا کنیم؟
لیستی از اکشنهای مطابق با API LEVEL 23 را برایتان آماده کردهام و انشالله به تک تک آنها خواهیم پرداخت. هرکدام که در سایت قرار گرفتند به انتهای این پست لینک خواهند شد.
android.app.action.ACTION_PASSWORD_CHANGED android.app.action.ACTION_PASSWORD_EXPIRING android.app.action.ACTION_PASSWORD_FAILED android.app.action.ACTION_PASSWORD_SUCCEEDED android.app.action.DEVICE_ADMIN_DISABLED android.app.action.DEVICE_ADMIN_DISABLE_REQUESTED android.app.action.DEVICE_ADMIN_ENABLED android.app.action.DEVICE_OWNER_CHANGED android.app.action.INTERRUPTION_FILTER_CHANGED android.app.action.LOCK_TASK_ENTERING android.app.action.LOCK_TASK_EXITING android.app.action.NEXT_ALARM_CLOCK_CHANGED android.app.action.NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED android.app.action.NOTIFICATION_POLICY_CHANGED android.app.action.PROFILE_PROVISIONING_COMPLETE android.app.action.SYSTEM_UPDATE_POLICY_CHANGED android.bluetooth.a2dp.profile.action.CONNECTION_STATE_CHANGED android.bluetooth.a2dp.profile.action.PLAYING_STATE_CHANGED android.bluetooth.adapter.action.CONNECTION_STATE_CHANGED android.bluetooth.adapter.action.DISCOVERY_FINISHED android.bluetooth.adapter.action.DISCOVERY_STARTED android.bluetooth.adapter.action.LOCAL_NAME_CHANGED android.bluetooth.adapter.action.SCAN_MODE_CHANGED android.bluetooth.adapter.action.STATE_CHANGED android.bluetooth.device.action.ACL_CONNECTED android.bluetooth.device.action.ACL_DISCONNECTED android.bluetooth.device.action.ACL_DISCONNECT_REQUESTED android.bluetooth.device.action.BOND_STATE_CHANGED android.bluetooth.device.action.CLASS_CHANGED android.bluetooth.device.action.FOUND android.bluetooth.device.action.NAME_CHANGED android.bluetooth.device.action.PAIRING_REQUEST android.bluetooth.device.action.UUID android.bluetooth.devicepicker.action.DEVICE_SELECTED android.bluetooth.devicepicker.action.LAUNCH android.bluetooth.headset.action.VENDOR_SPECIFIC_HEADSET_EVENT android.bluetooth.headset.profile.action.AUDIO_STATE_CHANGED android.bluetooth.headset.profile.action.CONNECTION_STATE_CHANGED android.bluetooth.input.profile.action.CONNECTION_STATE_CHANGED android.bluetooth.pan.profile.action.CONNECTION_STATE_CHANGED android.hardware.action.NEW_PICTURE android.hardware.action.NEW_VIDEO android.hardware.hdmi.action.OSD_MESSAGE android.hardware.input.action.QUERY_KEYBOARD_LAYOUTS android.intent.action.ACTION_POWER_CONNECTED android.intent.action.ACTION_POWER_DISCONNECTED android.intent.action.ACTION_SHUTDOWN android.intent.action.AIRPLANE_MODE android.intent.action.APPLICATION_RESTRICTIONS_CHANGED android.intent.action.BATTERY_CHANGED android.intent.action.BATTERY_LOW android.intent.action.BATTERY_OKAY android.intent.action.BOOT_COMPLETED android.intent.action.CAMERA_BUTTON android.intent.action.CONFIGURATION_CHANGED android.intent.action.CONTENT_CHANGED android.intent.action.DATA_SMS_RECEIVED android.intent.action.DATE_CHANGED android.intent.action.DEVICE_STORAGE_LOW android.intent.action.DEVICE_STORAGE_OK android.intent.action.DOCK_EVENT android.intent.action.DOWNLOAD_COMPLETE android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED android.intent.action.DREAMING_STARTED android.intent.action.DREAMING_STOPPED android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE android.intent.action.FETCH_VOICEMAIL android.intent.action.GTALK_CONNECTED android.intent.action.GTALK_DISCONNECTED android.intent.action.HEADSET_PLUG android.intent.action.HEADSET_PLUG android.intent.action.INPUT_METHOD_CHANGED android.intent.action.LOCALE_CHANGED android.intent.action.MANAGE_PACKAGE_STORAGE android.intent.action.MEDIA_BAD_REMOVAL android.intent.action.MEDIA_BUTTON android.intent.action.MEDIA_CHECKING android.intent.action.MEDIA_EJECT android.intent.action.MEDIA_MOUNTED android.intent.action.MEDIA_NOFS android.intent.action.MEDIA_REMOVED android.intent.action.MEDIA_SCANNER_FINISHED android.intent.action.MEDIA_SCANNER_SCAN_FILE android.intent.action.MEDIA_SCANNER_STARTED android.intent.action.MEDIA_SHARED android.intent.action.MEDIA_UNMOUNTABLE android.intent.action.MEDIA_UNMOUNTED android.intent.action.MY_PACKAGE_REPLACED android.intent.action.NEW_OUTGOING_CALL android.intent.action.NEW_VOICEMAIL android.intent.action.PACKAGE_ADDED android.intent.action.PACKAGE_CHANGED android.intent.action.PACKAGE_DATA_CLEARED android.intent.action.PACKAGE_FIRST_LAUNCH android.intent.action.PACKAGE_FULLY_REMOVED android.intent.action.PACKAGE_INSTALL android.intent.action.PACKAGE_NEEDS_VERIFICATION android.intent.action.PACKAGE_REMOVED android.intent.action.PACKAGE_REPLACED android.intent.action.PACKAGE_RESTARTED android.intent.action.PACKAGE_VERIFIED android.intent.action.PHONE_STATE android.intent.action.PROVIDER_CHANGED android.intent.action.PROXY_CHANGE android.intent.action.REBOOT android.intent.action.SCREEN_OFF android.intent.action.SCREEN_ON android.intent.action.TIMEZONE_CHANGED android.intent.action.TIME_SET android.intent.action.TIME_TICK android.intent.action.UID_REMOVED android.intent.action.USER_PRESENT android.intent.action.WALLPAPER_CHANGED android.media.ACTION_SCO_AUDIO_STATE_UPDATED android.media.AUDIO_BECOMING_NOISY android.media.RINGER_MODE_CHANGED android.media.SCO_AUDIO_STATE_CHANGED android.media.VIBRATE_SETTING_CHANGED android.media.action.CLOSE_AUDIO_EFFECT_CONTROL_SESSION android.media.action.HDMI_AUDIO_PLUG android.media.action.OPEN_AUDIO_EFFECT_CONTROL_SESSION android.net.conn.BACKGROUND_DATA_SETTING_CHANGED android.net.conn.CONNECTIVITY_CHANGE android.net.nsd.STATE_CHANGED android.net.scoring.SCORER_CHANGED android.net.scoring.SCORE_NETWORKS android.net.wifi.NETWORK_IDS_CHANGED android.net.wifi.RSSI_CHANGED android.net.wifi.SCAN_RESULTS android.net.wifi.STATE_CHANGE android.net.wifi.WIFI_STATE_CHANGED android.net.wifi.p2p.CONNECTION_STATE_CHANGE android.net.wifi.p2p.DISCOVERY_STATE_CHANGE android.net.wifi.p2p.PEERS_CHANGED android.net.wifi.p2p.STATE_CHANGED android.net.wifi.p2p.THIS_DEVICE_CHANGED android.net.wifi.supplicant.CONNECTION_CHANGE android.net.wifi.supplicant.STATE_CHANGE android.nfc.action.ADAPTER_STATE_CHANGED android.os.action.DEVICE_IDLE_MODE_CHANGED android.os.action.POWER_SAVE_MODE_CHANGED android.provider.Telephony.SIM_FULL android.provider.Telephony.SMS_CB_RECEIVED android.provider.Telephony.SMS_DELIVER android.provider.Telephony.SMS_EMERGENCY_CB_RECEIVED android.provider.Telephony.SMS_RECEIVED android.provider.Telephony.SMS_REJECTED android.provider.Telephony.SMS_SERVICE_CATEGORY_PROGRAM_DATA_RECEIVED android.provider.Telephony.WAP_PUSH_DELIVER android.provider.Telephony.WAP_PUSH_RECEIVED android.speech.tts.TTS_QUEUE_PROCESSING_COMPLETED android.speech.tts.engine.TTS_DATA_INSTALLED
چطور میتوینم از Broadcast Receiver استفاده کنیم؟
1- کدهای مورد نیاز در Manifest:
برای ایجاد Receiver ما باید در فایل Manifest و در بدنهی تگ Application ، تگی به اسم receiver ایجاد کنیم. در واقع مثل تگ activity و service از این هم برای تعریف receiver ها و شناساندن آنها به اندروید، استفاده میشود که شکل سادهی آن به صورت زیر است:
<receiver android:name=".ReceiverTest"> <intent-filter> <action android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> </intent-filter> </receiver>
نام کلاس رسیور را ReceiverTest قرار دادهایم و داخل intent-filter مشخص کردهایم که این رسیور برای چه اکشن هایی اجرا شود.
نکته: برای اضافه کردن اکشنهای دیگر به یک رسیور، میتوان داخل intent-filter چند مورد دیگر نیز به هما نصورت قبل اضافه کرد اما باید توجه داشت که در داخل کد، باید اکشنها را بررسی کنیم تا بدانیم از چه سمتی دریافت شده است.
2- ایجاد کلاس رسیور:
کلاسی با نام ReceiverTest در پکیج اصلی خود ایجاد کنید.
package com.fullkade.learnming.receiver; import android.content.BroadcastReceiver; import android.content.Context; public class ReceiverTest extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { } }
شرح کد:
- کلاس رسیور حتما باید از BroadcastReceiver مشتق شود.
- متد onReceive باید Override شود، چرا که موقع اتفاق افتادن اکشنهای فیلتر شده، این قسمت قرار است اجرا شود.
- ورودی متد شامل یک context و یک intent میباشد.
- context: مربوط به چیزی است که رسیور را اجرا کرده است.
- intent: اطلاعاتی که به رسیور ارسال شده است.
مثلا از چه اکشنی ارسال شده است که میتوانیم به صورت زیر آن را بررسی کنیم:
if (intent.getAction().equals("android.permission.RECEIVE_BOOT_COMPLETED")) { }
یه روش دیگه برای تعریف Broadcast Receiver
این روش، تعریف Broadcast در داخل کد میباشد:
BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(DownloadManager.ACTION_NOTIFICATION_CLICKED)) { Toast.makeText(context, "Clicked", Toast.LENGTH_LONG).show(); } } } }; context.registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_NOTIFICATION_CLICKED));
اول اینکه درک نحوهی تعریف این کد و بدنهی آن به دانش شما از جاوا مربوط میشود و بحث این پست نیست و دوم اینکه در اینجا چون به Manifest دسترسی نداریم، از طریق context میتوانیم اکشن را برای رسیور تنظیم کنیم که باید توجه داشته باشید هروقت context از بین برود، این رسیور نیز از بین خواهد رفت.
میشه یه Broadcast شخصی ایجاد کرد؟
سوال این است که آیا ما هم میتوانیم برای خودمان یک Broadcast ایجاد کنیم تا نرمافزارهای حساس به آن، دریافتش کنند؟!
بله میتوانیم:
Intent intent = new Intent(); intent.setAction("com.fullkade.CUSTOM_INTENT"); sendBroadcast(intent);
در اینجا اینتنتی ایجاد و اکشنی را برای آن تنظیم کردهایم که مقدار آن نیز دلخواه میباشد. با اجرای متد sendBroadcast، رسیورِ هرنرم افزاری که این اکشن را برای خود تعریف کرده باشد، اجرا خواهد شد.
سوال 1: الآن اگر برنامهای به جای اکشن دلخواه، اکشن بوت را ارسال کند چه اتفاقی میافتد؟! درحالی که هنوز گوشی که بوت نشده است!
سوال 2: آیا برای اکشن خودمان میتوانیم در داخل همان برنامه یک رسیور ایجاد کنیم؟
جواب این دو سوال را به خودتان واگذار میکنم تا تست کید و خودتان نتیجه بگیرید.
سلام ضمن تشکر از آموزشتون. من میخوام در حالی که صفحه گوشی قفل هست با فشردن دکمه یا کلید مربوط به صدا که معمولا بغل گوشی هست دستوراتی در برنامه ای که نوشتم اجرا بشه مثلا مقدار زمان یا ساعت گوشی در دیتابیس ذخیره بشه و یا صدایی پخش شود.
اصول و روش این کار چی هست
در حالیکه صفحه گوشی قفل نیست به راحتی این کار انجام میدم ولی وقتی صفحه قفل هست انگار که هیچ
سلام دوست عزیز
لطفا فقط درباره پست مربوطه سوال کنید
برای مدیریت کلید های صدا هم می تونید متد dispatchKeyEvent رو override کنید.
سلام مجدد. فکر میکنم سوال من مربوط به همین پست هست.
وقتیکه صفحه گوشی قفل هست کلید صدا عمل نمیکند
تو اینترنت گشتم نوشته شده که باید از broadcast receiver استفاده شود.
متشکرم
پوزش، قسمت اخر نظرتونو دقت نکردم.
پست زیر رو منتشر کردم
http://fullkade.com/1395/11/android-programming-broadcast-receiver-volume/
سلام
من مي خواهم با همين برودكست در زمانهاي مشخصي كدي اجرا بشه
در اندرويدهاي پايين اجرا ميشه ولي در اندرويد 6 اجرا نميشه
ممكنه يه نمونه كد براي اندرويد 6 برام بفرستيد
ممنون
سلام
از چه روشی استفاده می کنید؟
سلام
آموزش عااالی بود. موفق باشید.
سلااااااااام خیلیی خوب بود .واقعا ممنون از وقتی و زحمتی که بای این آموزش ها میکشید.
عالی بود
ممنونم
البته اینکه شما اشاره کردید رسیورها چه برنامه در حال اجرا باشد چه بسته اجرا خواهد شد، در مورد رسیورهای استاتیک صادق یا استیکی ها صادق هست و در مورد رسیورهای دینامیک درست نیست.
در مورد رسیورهاییه که تو منیفست تعریف شدن
سلام
تشکر بابت آگاهیتون
بنده میخوام یه broadcast receiver بنویسم که اگر کاربر در هر زمانی ارتباط اینترنت رو قطع یا وصل کرد مثلا بهش یه Toast نمایش بدم
ممنون میشم راهنمایی کنید که چطور باید ازش استفاده کنم چون نوشتن کد یه طرف و استفاده کردنش یه طرف 🙂
چون تازه کارم میپرسم .. ممنون
سلام؛ باید از اکشن “android.net.conn.CONNECTIVITY_CHANGE” استفاده کنید تو داخل این اکشن بررسی کنید که وصله یا نه!
طبق این آموزش یکی ساختم :
******************************************
اینم مانیفست :
“خطا: کد نامعتبر!”
مشکل اینجاست که مثلا وارد یه صفحه میشید یه پیام میاد که به اینترنت وصل هستید یا نه ..میخوام زمانی که اینترنت وصل شد بلافاصله تو هر صفحه ای بودم بهم پیام بده اینترنت وصل هست یا نه به همین منظور از آموزش بالا هم اسافاده کردم ولی درست نشد ..فقط در بدو ورود به اکتیویتی بهم پیام میده که اینجوری خوب نیست .
ممنون از پاسختون
یه آموزش جهت بررسی صحیح نحوهی اینترنت در هرلحظه به انتهای همین مطلب لینک شد.
بقیه کدهاتون رو هم نمیدونم چی نوشتین و همش به دانش خودتون بستگی داره!
ممنونم
سلام. خسته نباشید. برای دریافت داده از esp8266-01 هم باید برودکست تعریف کرد؟
سلام. تا جایی که میدونم به برودکست ارتباطی نداره چون این یه چیز مربوط به اتفاقات داخل سیستمه
ظاهرن باید از HTTP Request استفاده کنید
سایت ای ول داره .لاکچری