آموزش کامل Broadcast Receiver در اندروید

آموزش کامل Broadcast Receiver در اندروید

آموزش کامل 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: آیا برای اکشن خودمان می‌توانیم در داخل همان برنامه یک رسیور ایجاد کنیم؟
جواب این دو سوال را به خودتان واگذار می‌کنم تا تست کید و خودتان نتیجه بگیرید.

پست‌های مرتبط

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

cp-codfk

نظرات ثبت شده 19 دیدگاه

    1. یاشین کاربر مهمان گفت:

      سلام ضمن تشکر از آموزشتون. من میخوام در حالی که صفحه گوشی قفل هست با فشردن دکمه یا کلید مربوط به صدا که معمولا بغل گوشی هست دستوراتی در برنامه ای که نوشتم اجرا بشه مثلا مقدار زمان یا ساعت گوشی در دیتابیس ذخیره بشه و یا صدایی پخش شود.
      اصول و روش این کار چی هست
      در حالیکه صفحه گوشی قفل نیست به راحتی این کار انجام میدم ولی وقتی صفحه قفل هست انگار که هیچ

      00
      1. هادی اکبرزاده مدیر سایت گفت:

        سلام دوست عزیز
        لطفا فقط درباره پست مربوطه سوال کنید
        برای مدیریت کلید های صدا هم می تونید متد dispatchKeyEvent رو override کنید.

    2. یاشین کاربر مهمان گفت:

      سلام مجدد. فکر میکنم سوال من مربوط به همین پست هست.
      وقتیکه صفحه گوشی قفل هست کلید صدا عمل نمیکند
      تو اینترنت گشتم نوشته شده که باید از broadcast receiver استفاده شود.
      متشکرم

      00
      1. هادی اکبرزاده مدیر سایت گفت:

        پوزش، قسمت اخر نظرتونو دقت نکردم.
        پست زیر رو منتشر کردم
        http://fullkade.com/1395/11/android-programming-broadcast-receiver-volume/

    3. رضا کاربر مهمان گفت:

      سلام
      من مي خواهم با همين برودكست در زمانهاي مشخصي كدي اجرا بشه
      در اندرويدهاي پايين اجرا ميشه ولي در اندرويد 6 اجرا نميشه
      ممكنه يه نمونه كد براي اندرويد 6 برام بفرستيد
      ممنون

      00
      1. هادی اکبرزاده مدیر سایت گفت:

        سلام
        از چه روشی استفاده می کنید؟

    4. نویدk,dn کاربر مهمان گفت:

      سلام
      آموزش عااالی بود. موفق باشید.

      00
    5. زینب محمدتبار کاربر مهمان گفت:

      سلااااااااام خیلیی خوب بود .واقعا ممنون از وقتی و زحمتی که بای این آموزش ها میکشید.

      00
    6. جعفر کاربر مهمان گفت:

      عالی بود
      ممنونم

      00
    7. امیرحسین حیدری کاربر مهمان گفت:

      البته اینکه شما اشاره کردید رسیورها چه برنامه در حال اجرا باشد چه بسته اجرا خواهد شد، در مورد رسیورهای استاتیک صادق یا استیکی ها صادق هست و در مورد رسیورهای دینامیک درست نیست.

      00
      1. هادی اکبرزاده مدیر سایت گفت:

        در مورد رسیورهاییه که تو منیفست تعریف شدن

    8. omid کاربر مهمان گفت:

      سلام
      تشکر بابت آگاهیتون
      بنده میخوام یه broadcast receiver بنویسم که اگر کاربر در هر زمانی ارتباط اینترنت رو قطع یا وصل کرد مثلا بهش یه Toast نمایش بدم
      ممنون میشم راهنمایی کنید که چطور باید ازش استفاده کنم چون نوشتن کد یه طرف و استفاده کردنش یه طرف 🙂
      چون تازه کارم میپرسم .. ممنون

      00
      1. هادی اکبرزاده مدیر سایت گفت:

        سلام؛ باید از اکشن “android.net.conn.CONNECTIVITY_CHANGE” استفاده کنید تو داخل این اکشن بررسی کنید که وصله یا نه!

        1. omid کاربر مهمان گفت:

          طبق این آموزش یکی ساختم :

          public class NetworkChangeReceiver extends BroadcastReceiver {
          
              @Override
              public void onReceive(final Context context, final Intent intent) {
                  final ConnectivityManager connMgr = (ConnectivityManager) context
                          .getSystemService(Context.CONNECTIVITY_SERVICE);
          
                  final android.net.NetworkInfo wifi = connMgr
                          .getNetworkInfo(ConnectivityManager.TYPE_WIFI);
          
                  final android.net.NetworkInfo mobile = connMgr
                          .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
          
                  if (wifi.isAvailable() || mobile.isAvailable()) {
                      // Do something
          
                      Log.d("Network Available ", "Flag No 1");
                  }
              }
          }
          

          ******************************************
          اینم مانیفست :

          “خطا: کد نامعتبر!”

          مشکل اینجاست که مثلا وارد یه صفحه میشید یه پیام میاد که به اینترنت وصل هستید یا نه ..میخوام زمانی که اینترنت وصل شد بلافاصله تو هر صفحه ای بودم بهم پیام بده اینترنت وصل هست یا نه به همین منظور از آموزش بالا هم اسافاده کردم ولی درست نشد ..فقط در بدو ورود به اکتیویتی بهم پیام میده که اینجوری خوب نیست .
          ممنون از پاسختون

          00
          1. هادی اکبرزاده مدیر سایت گفت:

            یه آموزش جهت بررسی صحیح نحوه‌ی اینترنت در هرلحظه به انتهای همین مطلب لینک شد.
            بقیه کدهاتون رو هم نمیدونم چی نوشتین و همش به دانش خودتون بستگی داره!

            1. omid کاربر مهمان گفت:

              ممنونم

              00
    9. محمد کاربر مهمان گفت:

      سلام. خسته نباشید. برای دریافت داده از esp8266-01 هم باید برودکست تعریف کرد؟

      00
      1. هادی اکبرزاده مدیر سایت گفت:

        سلام. تا جایی که میدونم به برودکست ارتباطی نداره چون این یه چیز مربوط به اتفاقات داخل سیستمه
        ظاهرن باید از HTTP Request استفاده کنید

    10. نادر کاربر مهمان گفت:

      سایت ای ول داره .لاکچری

      00
توضیحات پیشنهادی نظرات اشتراک