broadcast reciver (برودکست رسیور ) در اندروید


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

۱ایجاد Broadcast Receiver : یک Broadcast Receiver به عنوان یک زیرکلاس از کلاس BroadcastReceiver اجرا می شود و فارغ از روش 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 : برای ثبت یک ریسیور باید در AndroidManifest.xml اون رو ثبت کنید. برای شروع کار یک پروژه جدید ایجاد می کنیم و اسمش رو SmsReceiver قرار میدیم. بروی لایه برنامه نیازی نیست کار خاصی انجام بدیم و همینطور کلاس MainAactivity.java چرا؟ چون ما برای ریسیورمون یک کلاس جدید ایجاد می کنم اسم این کلاس MySMSApp هست که extends میکنیم به BroadcastReceiver تا همیشه اماده فعالیت باشه. در داخل این کلاس ابتدا یک متد onReceive ایجاد میکنم تا به محض اینکه پیام جدیدی دیافت شد اون رو از طریق intent برای نمایش به Toast بفرسته. ( کدهای کامل کلاس MySMSApp )

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;

public class MySMSApp extends BroadcastReceiver {

public static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";

@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub


//دریافت پیام از ریسیور
if (intent.getAction().equals(ACTION)){ 
Bundle bundle = intent.getExtras();
if (bundle != null){
//بازیابی پیام دریافت شده
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++){
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
for (SmsMessage message : messages){

/*
* نام ارسال کننده پیام
* متن پیام
*/
String strMessageFrom = message.getDisplayOriginatingAddress();
String strMessageBody = message.getDisplayMessageBody();


//نمایش نام ارسال کننده
Toast.makeText(context, "SMS Message received from:" +strMessageFrom,  Toast.LENGTH_LONG).show();
//نمایش پیام اصلی
Toast.makeText(context, "SMS Message content" +strMessageBody,  Toast.LENGTH_LONG).show();

}
} 
} 
}

}

۳بعد از تموم کردن کلاسمون،باید بریم به سراغ فایل منیفست Mainifest.xml و اضافه کردن تگ receiver به این فایل.تگ receiver به برنامه اجازه میده همیشه SMS_RECEIVED اندروید رو بررسی کنه و به محض دریافت پیام جدید اون رو به نمایش بزاره (یادتون نره که اسم تگ receiver باید با کلاس جاوایی که ساختیم هماهنگ باشه )

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.appinapps.smsreceiver"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
android:minSdkVersion=”8″
android:targetSdkVersion=”17″ />

<application
android:allowBackup=”true”
android:icon=”@drawable/ic_launcher”
android:label=”@string/app_name”
android:theme=”@style/AppTheme” >
<activity
android:name=”com.appinapps.smsreceiver.MainActivity”
android:label=”@string/app_name” >
<intent-filter>
<action android:name=”android.intent.action.MAIN” />

<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
</activity>

<!– دریافت کننده پیام –>
<receiver android:name=”.MySMSApp”>
<intent-filter>
<action android:name=”android.provider.Telephony.SMS_RECEIVED” />
</intent-filter>
</receiver>
</application>
</manifest>

۴برودکست های سیستم: لیستی از حوادث سیستمی مهم برای استفاده در برودکست برنامه :

  • Intent.ACTION_BOOT_COMPLETED : زمانی که سیستم به صورت کامل بوت می شود.
  • Intent.ACTION_POWER_CONNECTED : زمانی که سیستم به برق متصل می شود.
  • Intent.ACTION_POWER_DISCONNECTED : زمانی که سیستم از برق جدا می شود.
  • Intent.ACTION_BATTERY_LOW : زمانی که باطری کم است.به طور معمول برای کاهش فعالیتهای برنامه استفاده می شود.
  • Intent.ACTION_BATTERY_OKAY : زمانی که وضعیت باطری مجددا خوب می شود (شارژ).

۵اجرای خودکار خدمات از یک ریسیور : یکی از نیازهای رایج، شروع یک سرویس برای همگام سازی اطلاعات بعد از کامل بوت شدن سیستم می باشد. برای این منظور می تونید یک ریسیور برای رویداد سیستمی android.intent.action.BOOT_COMPLETED ثبت کنید.این ریسیور نیاز به دسترسی android.permission.RECEIVE_BOOT_COMPLETED دارد.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ir.esfandune.android.ownservice.local"
    android:versionCode="1"
    android:versionName="1.0" >

<uses-sdk android:minSdkVersion=”10″ />

<uses-permission android:name=”android.permission.RECEIVE_BOOT_COMPLETED” />

<application
android:icon=”@drawable/icon”
android:label=”@string/app_name” >
<activity
android:name=”.ServiceConsumerActivity”
android:label=”@string/app_name” >
<intent-filter>
<action android:name=”android.intent.action.MAIN” />

<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
</activity>
<receiver android:name=”MyScheduleReceiver” >
<intent-filter>
<action android:name=”android.intent.action.BOOT_COMPLETED” />
</intent-filter>
</receiver>
<receiver android:name=”MyStartServiceReceiver” >
</receiver>
</application>

</manifest>