آموزش Broadcast Receivers در اندروید
Broadcast Receiver ها به سادگی به پیام های پخش شده از برنامه های دیگر یا از خود سیستم پاسخ می دهند. این پیام ها بعضاً رویداد یا مفهوم (event, intent) خوانده می شوند. به عنوان مثال ، برنامه ها می توانند به سایر برنامه ها خبر دهند که برخی داده ها در دستگاه بارگیری شده است و برای استفاده در دسترس است ، بنابراین این Broadcast Receiver است که این ارتباط را رهگیری و اقدامات مناسب را آغاز می کند.
دو مرحله مهم برای کار با BroadcastReceiver برای مفاهیم (intent) پخش شده در سیستم وجود دارد –
- ایجاد Broadcast Receiver.
- ثبت Broadcast Receiver.
یک مرحله دیگر وجود دارد که اگر می خواهید intent های سفارشی خود را پیاده کنید باید آن ها را ایجاد و پخش کنید.
ایجاد Broadcast Receiver
Broadcast Receiver به عنوان زیر کلاس کلاس BroadcastReceiver پیاده سازی می شود و متد ()onReceive که در آن هر پیام به عنوان یک پارامتر شی Intent دریافت می شود را override می کند.
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>
حال هر وقت دستگاه اندروید شما بوت شد ، توسط BroadcastReceiver MyReceiver رهگیری می شود و منطق پیاده سازی شده درون onReceive() اجرا خواهد شد.
چندین رویداد ایجاد شده از سیستم وجود دارد که به عنوان فیلدهای ایستای قطعی در کلاس Intent تعریف شده اند. در جدول زیر چند رویداد مهم سیستم آورده شده است.
شماره | رویداد ثابت و توضیحات |
۱ | android.intent.action.BATTERY_CHANGED
اطلاعات حاوی وضعیت شارژ، سطح شارژ و سایر اطلاعات در مورد باتری را پخش می کند. |
۲ | android.intent.action.BATTERY_LOW
وضعیت باتری کم را در دستگاه نشان می دهد. |
۳ | android.intent.action.BATTERY_OKAY
نشان می دهد باتری پس از کم شدن، در حال حاضر خوب است. |
۴ | android.intent.action.BOOT_COMPLETED
این پیام پس از پایان بوت شدن سیستم پخش می شود. |
۵ | android.intent.action.BUG_REPORT
فعالیت را برای گزارش یک اشکال نشان می دهد. |
۶ | android.intent.action.CALL
تماس با شخصی را که توسط داده ها مشخص شده است برقرار می کند. |
۷ | android.intent.action.CALL_BUTTON
زمانی که کاربر دکمه “call” را فشار داده تا به شماره گیر یا UI مناسب دیگر برای برقراری تماس برود. |
۸ | android.intent.action.DATE_CHANGED
تاریخ تغییر کرده را نشان می دهد. |
۹ | android.intent.action.REBOOT
راه اندازی مجدد دستگاه. |
پخش intent های سفارشی
اگر می خواهید برنامه intent سفارشی ایجاد و ارسال کند ، باید با استفاده از متد sendBroadcast() در کلاس Activity خود این intent ها را ایجاد و ارسال کنید. اگر از متد (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 ایجاد کردیم دنبال کنید –
مرحله | توضیحات |
۱ | می توانید از studio Android برای ایجاد یک برنامه اندرویدی استفاده کنید و آن را تحت پکیج com.example.tutorialspoint7.myapplication همانطور که در بخش Hello World Example توضیح داده شد، نامگذاری کنید. |
۲ | فایل MainActivity.java را تغییر دهید و متد transmetIntent() را اضافه کنید. |
۳ | یک فایل جاوا جدید به نام MyReceiver.java را تحت پکیج com.example.tutorialspoint7.myapplication برای تعریف BroadcastReceiver ایجاد کنید. |
۴ | یک برنامه می تواند بدون محدودیت یک یا چند intent سفارشی و سیستمی را کنترل کند. هر intentی که می خواهید رهگیری کنید باید با استفاده از تگ <receiver …/> در فایل AndroidManifest.xml ثبت شود. |
۵ | محتوای پیش فرض فایل res / layout / activity_main.xml را تغییر دهید تا دکمه ای برای پخش intent اضافه شود. |
۶ | بدون نیاز به تغییر فایل رشته ، Android studio از فایل string.xml مراقبت می کند. |
۷ | برنامه را اجرا کنید تا شبیه ساز اندروید راه اندازی شود و نتیجه تغییرات انجام شده در برنامه را مشاهده کنید. |
در زیر محتوای فایل MainActivity.java آورده شده است. این فایل می تواند شامل هر یک از متد های اساسی چرخه حیات باشد. ما برای پخش یک intent سفارشی ، متد ()transmetIntent را اضافه کرده ایم.
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);
}
}
در زیر محتوای فایل MyReceiver.java آورده شده است.
package com.example.tutorialspoint7.myapplication;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
/**
برنامه نویسی اندروید رو قورت بده! بدون کلاس، سرعت 2 برابر، ماندگاری 3 برابر، پولسازی با ساخت اپلیکیشن و بازی، سه پک زیر جوابت هست:
* 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 اصلاح شده خود را اجرا کنیم! فرض می کنیم هنگام انجام تنظیمات محیطی ، AVD خود را ایجاد کرده اید. برای اجرای برنامه از Android studio ، یکی از فایل های activity پروژه را باز کرده و از نوار ابزار ، روی نماد Run Eclipse Run Icon کلیک کنید. Android Studio برنامه را در AVD شما نصب می کند و آن را راه اندازی می کند و اگر تنظیمات برنامه درست باشد ، پنجره Emulator زیر نمایش داده می شود –
حال برای پخش intent سفارشی ما ، بر روی دکمه Broadcast Intent کلیک می کنیم ، این برنامه intent سفارشی “com.tutorialspoint.CUSTOM_INTENT” را منتشر می کند که توسط BroadcastReceiver ثبت شده ما یعنی MyReceiver ردیابی می شود و طبق منطق پیاده سازی ما، عبارتی به شرح زیر در پایین شبیه ساز ظاهر می شود –
می توانید سایر BroadcastReceiver ها را اجرا کنید تا intent های ایجاد شده از سیستم مانند بوت شدن سیستم ، تغییر تاریخ ، سطح باتری پایین و غیره را رهگیری کنید.