آموزش استفاده از Broadcast Receiver

Broadcast Receiver چیست ؟

اندروید اتفاق هایی که در سطح سیستم می افتد را با broadcast اعلام می کند و اپلیکیشن می توانند برای این broadcast ها reciver تعریف کنند تا هنگام رخ دادن اتفاق ها به اپلیکیشن مطلع شود.

مثلا زمانی که باتری رو به اتمام است رخداد : Intent.ACTION_BATTERY_LOW منتشر می شود یا زمانی که سیستم بوت می شود Intent.ACTION_BOOT_COMPLETED منتشر می شود (البته برای استفاده از بعضی برادکاست ها نیاز به Permision هایی در برنامه دارید ، مثلا همین بوت شدن نیاز به دسترسی android.permission.RECEIVE_BOOT_COMPLETED دارد)

خوب حالا ادامه کار رو با یک مثال جلو می برم :

من در برنامه خودم از دانلود منیجر اندروید استفاده کردم ، و حالا نیاز دارم زمان کامل شدن دانلود ، به برنامه پیغام داده شود تا وضعیت دانلود رو در دیتابیس ذخیره کنم .

Android DownloadManager پس از پایان دانلود رخداد android.intent.action.DOWNLOAD_COMPLETE را منتشر می کند ، پس من نیاز دارم که برای این رخداد یک receiver بسازم

۱ – به AndroidManifest.xml می روم و کد های زیر را قرار می دهم :

 

 

<receiver android:name=".receiver.DownloadComplateChecker">
            <intent-filter>
                <action android:name="android.intent.action.DOWNLOAD_COMPLETE">
                </action>
            </intent-filter>
</receiver>

 

 

در این کد receiver را تعریف کردم تا زمان رخ دادن برادکاست android.intent.action.DOWNLOAD_COMPLETE باز شود .

.receiver.DownloadComplateChecker 

آدرس فایل جاوا من هست که در آن کلاسی به نام DownloadComplateChecker وجود دارد که کلاس BroadcastReceiver را گسترش می دهد (extends می کند)

 

۲ – کلاس DownloadComplateChecker را به صورت زیر می سازم :

 

package ir.iact.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;

public class DownloadComplateChecker extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

    }
}

خوب تمومه 😀 ، حالا هروقت که دانلودی تموم بشه به اپلیکیشن خبر داده میشه و متد onReceive اجرا می شود.

حالا میتونم توی متد onReceive کد های مورد نظرم رو بنویسم

بقیه کد های برنامه که مربوط به دانلود منیجر و دیتابیس هست رو اینجا نمیگم فقط شروع مثال بود ، اما چند موضوع مهم دیگر رو اینجا باید بگم :

برای اینکه از صحت برادکاست رسیده شده اطمینان حاصل کنید می تونید این شرط رو چک کنید :

if (intent.getAction().equals("android.intent.action.DOWNLOAD_COMPLETE"))

 

میتونید یک اینتنت ایجاد کنید و یک اکتیویتی را باز کنید :

            Intent downloadActivityIntent = new Intent(context, MainActivity.class);
            downloadActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(downloadActivityIntent);

 

که البته FLAG های زیادی هست ، این FLAG تعیین می کند که اگر اکتیویتی باز هست بازهم یک اکتیویتی جدید باز کن (FLAG های دیگر را هنوز بررسی نکردم)

 

یک مطلب دیگر اینکه ما میتونیم برادکاست هایی را ایجاد کنیم :

 

      Intent intent = new Intent();
      intent.setAction("ir.iact.CUSTOM_INTENT");
      sendBroadcast(intent);

و برای آن در همین اپلیکیشن یا اپلیکیشن های دیگر receiver تعیین کنیم

<receiver android:name="MyReceiver">
          <intent-filter>
          <action android:name="ir.iact.CUSTOM_INTENT">
          </action>
          </intent-filter>
</receiver>

 

 

روش دیگری برای تعریف broadcast ها وجود دارد که می توان در خود برنامه آن را تعریف کرد (در صورتی که context داده شده از بین رود غیر فعال می شود)

 

        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));

 

در این کد برای زمانی که روی نوتیفیکیشن بر روی علامت درحال دانلود DownloadManager کلیک می شود یک receiver تعریف کردم .

 

امیدوارم مفید بوده باشه 🙂

 

صفحه اصلی آموزش : آموزش برنامه نویسی اندروید
برچسب ها:
پست قبلی
پست بعدی

درباره ایلیا عابدینی

برنامه نویس اندروید و کارشناس مهندسی پزشکی، نفر سوم مسابقه برنامه نویسی اندروید http://www.schallenge.ir ، از سال 92 برنامه نویسی اندروید رو شروع کردم و در حال حاضر در شرکت عصر دانش در حال توسعه اپلیکیشن تجارت پی می باشدم ، این وبلاگ رو ساختم تا تجربیات روزانه و مفید خودم رو داخل اون بزارم. رزومه : iact.ir/cv

14 دیدگاه

  1. سلام

    چند نوع boardcaste reciver وجود داره ؟

    واینکه اگه بخوام از لیست کامل این boardcaste reciver دست پیدا کنم به کجا مراجعه کنم؟

  2. سلام ممنون از مطالب واقعا کاربردی که می زارید
    برنامه من چه جوری میشه خودشو بتونه آپدیت کنه؟ یعنی مدیریت اینکه ورژن جدید و بتونم با فایل ارسال کنم برای گوشی و وقتی که دانلود تموم شد خودش بره apk جدید اجرا کنه این روشی بود که بنظرم اومد روش دیگه نمی دونم
    با تشکر

    • خواهش می کنم

      برای به روز کردن برنامه میتونید در ابتدا هر بار که باز میشه یک فایل json حاوی اطلاعات شماره نسخه رو چک کنید و اگر نسخه جدید بود لینک بدید که کاربر خودش بره از بازار اپدیت کنه

      این ساده ترین روش و پرکاربرد ترین هست 

  3. سلام.

    آموزش که گذاشتید واقعأ مفید و آموزنده بود.

    اگر بخوایم با برودکست مختصات جی پی اس رو بگیریم به چه صورته؟

    چه برودکستی فعال میشه ؟

    چطوری باید انجام داد. 

    مرسی

  4. دمت گرم 

    ینی اینقد تو اینترنت گشتم اما مطلبی به این خوبی در مورد broadcast ها پیدا نکردم واقعا عالی بود .

  5. سلام
    من برای اینکه برنامه ام پس از روشن شدن screen, اجرا بشه،، از برودکست screen_on و screen _off. استفاده کردم ولی اصلاً جواب نمیده،، از برودکست های دیگه استفاده کردم درست کار میکنه،، لطفا کمکم کنید

    • سلام
      من برای اینکه برنامه ام پس از روشن شدن screen, اجرا بشه،، از برودکست screen_on و screen _off. استفاده کردم ولی اصلاً جواب نمیده،، از برودکست های دیگه استفاده کردم درست کار میکنه،، لطفا کمکم کنید

  6. سلام
    من برای اینکه برنامه ام پس از روشن شدن screen, اجرا بشه،، از برودکست screen_on و screen _off. استفاده کردم ولی اصلاً جواب نمیده،، از برودکست های دیگه استفاده کردم درست کار میکنه،، لطفا کمکم کنید

    …….
    ……
    …….
    …..

  7. سلام

    من میخوام برودکست مربوط به تغییر تاریخ رو استفاده کنم کسی میدونه چیه؟

    میخوام وقتی ۱۲ شب که تاریخ عوض میشه یه برودکست بهم بده

  8. باسلام خدمت استاد.
    باتشکراز سایت فوق العادتون ، من میخواستم یه برنامه ایی بسازم که داخل اون کاربر شماره تلفنشو واردکنه و شماره ذخیره بشه بعد به طوراتوماتیک اس ام اس به شماره ذخیره شده ارسال بشه .
    میشه اموزش این کاررو برام ایمیل کنید.
    واقعا ازتون خیلی ممنون میشم،روی این موضوع گیرکردم لطفا کمکم کنید.
     

  9. آقای عابدینی سلام

    دو تا سوال ۱ : آیا این امکان هست که نرم افزار غیر رایگان ما رو یک نفر از بازار بخره و با شیر ایت اونو برای دیگران بفرسته بدون اینکه منبلغی پرداخت کنه ؟ اگر بله آیا راهی برای مقابله با اون وجود داره؟ (من خودم از شیرایت استفاده نمیکنم )

     2.

    من به دلایلی مجبورم کلاس رسیور رو داخل یک کلاس دیگه که اکتیویتی نیست تعریف کنم . ولی با کرش وبرو میشم چه کار باید بکنم ؟

    • سلام

      ۱ – بله امکانش هست، من تا حالا این کار رو نکردم و نمیدونم چطور میشه قفلی چیزی گزاشت، اما میتونی با درون برنامه و یا رجیستر کردن برنامه ها با شماره موبایل شخص تعداد استفاده کننده هارو کنترل کنی

      ۲ – یا باید از داخل سرویس یا اکتیویتی این رو دریافت کنی و به کلاس مورد نظر بفرستی ، یا اینکه میتونی از لایبرری Event Bus استفاده کنی : http://iact.ir/event-bus/

دیدگاهتان را ثبت کنید

آدرس ایمیل شما منتشر نمی شود.علامت دارها لازمند. *

*

رفتن به بالا