Broadcast Receiversها به سادگی به پیام های منتشر شده از سوی سایر اپلیکیشن ها یا خودِ سیستم پاسخ می دهند. این پیام ها گاهی رویداد (event) یا مفهوم (intent) نامیده می شوند. برای مثال، اپلیکیشن ها می توانند برای آگاه کردن سایر اپلیکیشن ها از اینکه داده­ ی خاصی در دستگاه دانلود شده و آماده­ ی استفاده است، پیام هایی را به آنها ارسال کنند. این دریافت کننده پیام (BroadcastReceiver) است که این ارتباط را شنود کرده و اقدام مناسب را انجام می دهد.

دو مرحله مهم برای کار کردن BroadcastReceiver در رابطه با intentهای برودکست شده در سیستم وجود دارد که عبارت اند از:

  • ایجاد Broadcast Receiver
  • ثبت (رجیستر کردن) Broadcast Receive

یک مرحله اضافی دیگر، در صورتی که شما قصد دارید intent های سفارشی خود را پیاده سازی کنید وجود دارد و آن ساخت و برودکست کردن آن intent می باشد.

ایجاد Broadcast Receiver

یک Broadcast Receiver به صورت زیر کلاسی (subclass) از کلاس BroadcastReceiver و override کردن متد onReceive() پیاده سازی می شود که در آن هر پیام به صورت یک پارامتر شی Intent دریافت می شود.

public class MyReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent intent) {
      Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
   }
}

 

ثبت Broadcast Receiver

یک اپلیکیشن با ثبت کردن یک Broadcast Receiver در فایل AndroidManifest.xml به intent های منتشر شده­ ی خاصی گوش  می دهد. در نظر داشته باشید که ما قصد داریم MyReceiver را برای رویداد سیستمی ACTION_BOOT_COMPLETED ثبت کنیم. این رویداد در زمان اتمام فرایند بوت کردن اندروید، به وسیله­ ی سیستم منتشر می شود.

<application
   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name"
   android:theme="@style/AppTheme" >
   <receiver android:name="MyReceiver">
   
      <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED">
         </action>
      </intent-filter>
   
   </receiver>
</application>

 

اکنون هر وقت که دستگاه اندرویدی شما بوت (راه اندازی) می شود، به وسیله­ ی دریافت کننده ­ی پیام MyReceiver شنود می شود و منطق پیاده سازی شده در متد onReceive() اجرا می شود.

چندین رویداد سیستمی وجود دارند که به صورت فیلدهای ایستای قطعی در کلاس Intent پیاده سازی می شوند. جدول زیر تعدادی از رویدادهای مهم سیستمی را نشان میدهد.

شماره فبلد ثابت رویداد و توضیحات
1 android.intent.action.BATTERY_CHANGEDاین برودکست از نوع چسبنده یا sticky است و مربوط به وضعیت شارژ ، سطح و اطلاعات دیگر باتری می باشد.
2 android.intent.action.BATTERY_LOWوضعیت “باتری ضعیف است” را در دستگاه نشان می دهد.
3 android.intent.action.BATTERY_OKAYنشان دهنده وضعیت خوب باتری بعد از خروج از وضعیت “باتری ضعیف است” می باشد.
4 android.intent.action.BOOT_COMPLETEDاین برودکست نشان دهنده بوت کامل سیستم می باشد.
5 android.intent.action.BUG_REPORTبرای نشان دادن اکتیویتی مربوط به گزارش یک باگ می باشد.
6 android.intent.action.CALLتماس با کسی که در دیتای مربوطه مشخص شده است.
7 android.intent.action.CALL_BUTTONنشان دهنده این است که کاربر دکمه “call” را برای ورود به صفحه شماره گیر یا سایر سایر صفحات مربوط به تماس، فشرده است.
8 android.intent.action.DATE_CHANGEDنشان دهنده این است که تاریخ دستگاه تغییر یافته است.
9 android.intent.action.REBOOTدرخواست ری بوت یا روشن خاموش شدن دستگاه.

انتشار intent های سفارشی (Broadcasting Custom Intents )

در صورتی که بخواهید اپلیکیشن شما خودش intent های سفارشی را ایجاد کرده و ارسال کند، شما باید این intent ها را با استفاده از متد sendBroadcast() در کلاس activity خود، ایجاد و ارسال کنید. در صورتی که شما از متد sendStickyBroadcast(Intent) استفاده کنید، intent شما sticky می شود به این معنا که Intent ارسالی شما، بعد از پایان انتشار باقی می ماند.

public void broadcastIntent(View view) {
   Intent intent = new Intent();
   intent.setAction("com.tutorialspoint.CUSTOM_INTENT");
   sendBroadcast(intent);
}

 

Intent (مفهوم) com.tutorialspoint.CUSTOM_INTENT نیز می تواند شبیه به intent  های ایجاد شده به وسیله­ ی سیستم ثبت شود.

<application
   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name"
   android:theme="@style/AppTheme" >
   <receiver android:name="MyReceiver">
   
      <intent-filter>
         <action android:name="com.tutorialspoint.CUSTOM_INTENT">
         </action>
      </intent-filter>
   
   </receiver>
</application>

 

مثال

این مثال، شرح می دهد که شما چگونه می توانید BroadcastReceiver را برای شنود intent سفارشی ایجاد کنید. زمانی که شما با intent سفارشی آشنا شدید، می توانید اپلیکیش خود را طوری برنامه نویسی کنید که intent های ایجاد شده به وسیله­ ی سیستم را شنود کند. مراحل زیر را برای تغییر اپلیکیشن اندرویدی ای که ما در بخش Hello World Example  ایجاد کردیم، دنبال کنید.

گام توضیح
1 ایجاد یک پروژه اپلیکیشن اندروید  در اندروید استدیو و نامگذاری آن به MyApplication و پکیجش به com.example.app2app.myapplication ، همانطور که در آموزش Hello World توضیح داده شد.
2 ویرایش فایل MainActivity.java برای اضافه کردن متد broadcastIntent().
3 ایجاد یک فایل جاوای جدید در پکیج com.example.app2app.myapplication به نام MyReceiver.java برای تعریف یک برودکست ریسیور.
4 یک اپلیکیشن می تواند یک یا بیشتر از یک اینتنت سفارشی و سیستمی را بدون هیچ محدودتی پشتیبانی کند. هر اینتنتی که می خواهید دریافت کنید باید با استفاده از تگ  <receiver…/>  در فایل AndroidManifest.xml اپلیکیشن ثبت کنید.
5 ویرایش کدهای پیش فرض فایل res/layout/activity_main.xml  برای قرار دادن دکمه ای برای برودکست کردن اینتنت.
6 نیازی به تغییر هیچ چیزی در فایل res/values/strings.xml نیست. اندروید استدیو مقادیر این فایل را مدیریت می کند.
7 اپلیکیشن را روی گوشی اجرا کنید و تغییرات ایجاد شده در اپلیکیشن را بررسی کنید.

در بخش ریز محتوای فایل فعالیت اصلی src/com.example.helloworld/MainActivity.java ارائه شده است. این فایل می تواند شامل هر کدام از متدهای اصلی چرخه حیات باشد. ما متد broadcastIntent() را برای انتشار یک intent سفارشی اضافه کرده ایم.

package com.example.tutorialspoint7.myapplication;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

   /** Called when the activity is first created. */
   @Override
   
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
   }


   // broadcast a custom intent.
      
   public void broadcastIntent(View view){
      Intent intent = new Intent();
      intent.setAction("com.tutorialspoint.CUSTOM_INTENT"); sendBroadcast(intent);
   }
}

 

بخش زیر نشان دهنده­ی محتوای مربوط به فایل

src/com.example.helloworld/MyReceiver.java است. 

package com.example.tutorialspoint7.myapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

/**
 * Created by TutorialsPoint7 on 8/23/2016.
 */
public class MyReceiver extends BroadcastReceiver{
   @Override
   public void onReceive(Context context, Intent intent) {
      Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
   }
}

 

بخش زیر نشان دهنده ­ی محتوای تغییریافته ­ی فایل AndroidManifest.xml است. در اینجا ما تگ <service…/> را برای وارد کردن سرویس مان اضافه کرده ایم.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.tutorialspoint7.myapplication">

   <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:supportsRtl="true"
      android:theme="@style/AppTheme">
    
      <activity android:name=".MainActivity">
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
   
      <receiver android:name="MyReceiver">
         <intent-filter>
            <action android:name="com.tutorialspoint.CUSTOM_INTENT">
            </action>
         </intent-filter>

      </receiver>
   </application>

</manifest>

 

بخش زیر نشان دهنده­ ی محتوای فایل res/layout/activity_main.xml برای وارد کردن یک دکمه جهت انتشار intent سفارشی مان است.

<RelativeLayout 
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools" 
   android:layout_width="match_parent"
   android:layout_height="match_parent" 
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin" 
   tools:context=".MainActivity">
   
   <TextView
      android:id="@+id/textView1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Example of Broadcast"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      android:textSize="30dp" />
      
   <TextView
      android:id="@+id/textView2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Tutorials point "
      android:textColor="#ff87ff09"
      android:textSize="30dp"
      android:layout_above="@+id/imageButton"
      android:layout_centerHorizontal="true"
      android:layout_marginBottom="40dp" />
      
   <ImageButton
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/imageButton"
      android:src="@drawable/abc"
      android:layout_centerVertical="true"
      android:layout_centerHorizontal="true" />
      
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/button2"
      android:text="Broadcast Intent"
      android:onClick="broadcastIntent"
      android:layout_below="@+id/imageButton"
      android:layout_centerHorizontal="true" />

</RelativeLayout>

 

اکنون می خواهیم اپلیکیشن تغییر یافته­ی Hello World! را اجرا کنیم، من فرض می کنم که شما ADV خود را در طول نصب محیط ایجاد کرده باشید. برای اجرای اپلیکیشن از Eclipse، یکی از فایل های فعالیت پروژه­ی خود را باز کنید و بر روی آیکن Run دکمه Run از نوار ابزار خود کلیک کنید. Eclipse، اپلیکیش را بر روی AVD شما نصب می کند و آن را آغاز می کند و در صورتی که همه ­ی موارد مربوط به تنظیمات و برنامه شما درست باشد، صفحه امولاتور زیر برای شما نمایش داده می شود.

اکنون برای انتشار intent سفارشی بر روی دکمه­ ی Broadcast Intent کلیک کنید. این کار intent سفارشی ما به نام “com.tutorialspoint.CUSTOM_INTENT” را منتشر می کند، این intent به وسیله ­ی BroadcastReceiver ثبت شده ­ی ما یعنی MyReceiver شنود می شود و با توجه به منطق پیاده سازی شده­ی ما، عبارت Intent Detected در انتهای صفحه شبیه ساز به صورت زیر نمایش داده می شود.

اکنون شما می توانید سایر BroadcastReceiver ها را برای شنود intent های ایجاد شده به وسیله­ ی سیستم مانند system bootup، date changed، low battery و غیره امتحان کنید.