تبلیغات

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

چطور می‌توینم از Broadcast Receiver استفاده کنیم؟

1- کدهای مورد نیاز در Manifest:
برای ایجاد Receiver ما باید در فایل Manifest و در بدنه‌ی تگ Application ، تگی به اسم receiver ایجاد کنیم. در واقع مثل تگ activity و service از این هم برای تعریف receiver ها و شناساندن آن‌ها به اندروید، استفاده می‌شود که شکل ساده‌ی آن به صورت زیر است:

نام کلاس رسیور را ReceiverTest  قرار داده‌ایم و داخل intent-filter مشخص کرده‌ایم که این رسیور برای چه اکشن هایی اجرا شود.

نکته: برای اضافه کردن اکشن‌های دیگر به یک رسیور، می‌توان داخل intent-filter چند مورد دیگر نیز به هما نصورت قبل اضافه کرد اما باید توجه داشت که در داخل کد، باید اکشن‌ها را بررسی کنیم تا بدانیم از چه سمتی دریافت شده است.

2- ایجاد کلاس رسیور:
کلاسی با نام ReceiverTest در پکیج اصلی خود ایجاد کنید.

شرح کد:

  • کلاس رسیور حتما باید از BroadcastReceiver مشتق شود.
  • متد onReceive باید Override شود، چرا که موقع اتفاق افتادن اکشن‌های فیلتر شده، این قسمت قرار است اجرا شود.
  • ورودی متد شامل یک context و یک intent می‌باشد.
    • context: مربوط به چیزی است که رسیور را اجرا کرده است.
    • intent: اطلاعاتی که به رسیور ارسال شده است.
      مثلا از چه اکشنی ارسال شده است که می‌توانیم به صورت زیر آن را بررسی کنیم:

 

یه روش دیگه برای تعریف Broadcast Receiver

این روش، تعریف Broadcast در داخل کد می‌باشد:

اول این‌که درک نحوه‌ی تعریف این کد و بدنه‌ی آن به دانش شما از جاوا مربوط می‌شود و بحث این پست نیست و دوم این‌که در این‌جا چون به Manifest دسترسی نداریم، از طریق context می‌توانیم اکشن را برای رسیور تنظیم کنیم که باید توجه داشته باشید هروقت context از بین برود، این رسیور نیز از بین خواهد رفت.

میشه یه Broadcast شخصی ایجاد کرد؟

سوال این است که آیا ما هم می‌توانیم برای خودمان یک Broadcast ایجاد کنیم تا نرم‌افزارهای حساس به آن، دریافتش کنند؟!

بله می‌توانیم:

در این‌جا اینتنتی ایجاد و اکشنی را برای آن تنظیم کرده‌ایم که مقدار آن نیز دلخواه می‌باشد. با اجرای متد sendBroadcast، رسیورِ هرنرم افزاری که این اکشن را برای خود تعریف کرده باشد، اجرا خواهد شد.

سوال 1: الآن اگر برنامه‌ای به جای اکشن دلخواه، اکشن بوت را ارسال کند چه اتفاقی می‌افتد؟! درحالی که هنوز گوشی که بوت نشده است!
سوال 2: آیا برای اکشن خودمان می‌توانیم در داخل همان برنامه یک رسیور ایجاد کنیم؟
جواب این دو سوال را به خودتان واگذار می‌کنم تا تست کید و خودتان نتیجه بگیرید.

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

تبلیغات
کانال تلگرام فول کده
تبلیغات

درباره نویسنده

هادی اکبرزاده

[ مدیر فول کده ]

علاقه‌مند به اشتراک گذاری اطلاعات در هر زمینه‌ای / برنامه‌نویس و دانشجوی ارشد رشته شبیه‌ساز هوشمند - در حال نوشتن یه رمان (اگه خدا بخواد و تموم شه 😁)

پاسخ دهید

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

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

    1. یاشین گفت:

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

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

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

    2. یاشین گفت:

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

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

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

    3. رضا گفت:

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

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

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

    4. نویدk,dn گفت:

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

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

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

    6. جعفر گفت:

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

    7. امیرحسین حیدری گفت:

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

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

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

    8. omid گفت:

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

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

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

        1. omid گفت:

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

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

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

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

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

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

            1. omid گفت:

              ممنونم