Broadcast Receivers در اندروید
به طور ساده Broadcast Receiver ها به پیام های انتشار یافته از طرف سیستم عامل یا سایر برنامه های کاربردی پاسخ می دهند. این پیغام ها گاهی اوقات رویداد یا اهداف هستند. برای مثال یک برنامه می تواند هنگامی که دانلود یک فایل به اتمام رسید یک پیغام منتشر کند تا سایر برنامه ها متوجه اتمام دانلود شده و بتوانند از آن فایل استفاده کنند.
دو مرحله مهم که برای پاسخ دادن به پیغام های منتشر شده از طرف سیستم وجود دارد را در زیر مشاهده می کنید:
- ایجاد یک Broadcast Receiver.
- ثبت Broadcast Receiver ایجاد شده.
ایجاد یک Broadcast Receiver
یک broadcast receiver به عنوان یک کلاس مشتق شده از کلاس BroadcastReceiver پیاده سازی می شود که متد onReceiver() در آن برای دریافت پیام ها بازنویسی شده است. پیغام ها به عنوان پارامتر Intent به این تابع ارسال می شوند.
1 2 3 4 5 6 | 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 یک Broadcast Receiver ثبت کنید. فرض کنید می خواهیم MyReceiver را برای رویداد ACTION_BOOT_COMPLETED که توسط سیستم تولید شده است، ثبت کنیم تا زمانی که فرآیند بوت سیستم کامل شد، برنامه ما واکنش دهد.
1 2 3 4 5 6 7 8 9 10 11 | <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 اطلاع از وضعیت باتری مانند کاهش میزان باتری و سایر اطلاعات. |
2 | android.intent.action.BATTERY_LOW اطلاع از زمانی که شارژ باتری کم است. |
3 | android.intent.action.BATTERY_OKAY زمانی که باتری بعد از وضعیت بحرانی به حالت مناسب می رسد. |
4 | android.intent.action.BOOT_COMPLETED زمانی که بوت سیستم عامل به پایان برسد یک پیام منتشر می کند. |
5 | android.intent.action.BUG_REPORT نمایش activity برای گزارش یک باگ. |
6 | android.intent.action.CALL تماس با کسی که با اطلاعات مشخص شده است. |
7 | android.intent.action.CALL_BUTTON برای زمانی که کاربر دکمه تماس را فشار دهد. |
8 | android.intent.action.DATE_CHANGED برای تغییر تاریخ. |
9 | android.intent.action.REBOOT برای راه اندازی مجدد سیستم. |
ارسال پیغام های سفارشی
با استفاده از متد sendBroadcast() درون کلاس activity می توانید پیام های سراسری خود را در سیستم منتشر کنید.
1 2 3 4 5 | public void broadcastIntent(View view) { Intent intent = new Intent(); intent.setAction("com.tutorialspoint.CUSTOM_INTENT"); sendBroadcast(intent); } |
حال اگر برنامه دیگری یک دریافت کننده برای پیغام بالا ثبت کرده باشد، می تواند در هنگام انتشار پیام در سیستم از آن اطلاع پیدا کند.
1 2 3 4 5 6 7 8 9 10 11 | <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> |
مثال
این مثال نحوه ایجاد یک Broadcast Receiver برای ردیابی پیام های سفارشی را نشان می دهد. زمانی که با نحوه دریافت پیام های سفارشی آشنا شوید دیگر برای دریافت پیام های منتشر شده از طرف سیستم مشکلی نخواهید داشت. بنابراین اجازه دهید برنامه Hello World ایجاد شده در فصول قبل را برای ایجاد یک Broadcast Recevier تغییر دهیم:
مرحله | توضیحات |
1 | ایجاد یک برنامه اندرویدی با نام My Application و بسته com.example.tutorialspoint7.myapplication در Android Studio. |
2 | ویرایش فایل MainActivity.java برای افزودن متد broadcastIntent() به آن. |
3 | ایجاد یک فایل جدید با نام MyReceiver.java تحت بسته com.example.tutorialspoint7.myapplication برای تعریف Broadcast Receiver. |
4 | یک برنامه می تواند یک یا چند دریافت کننده بدون محدودیت برای دریافت پیام های سیستم و سایر برنامه ها ایجاد کند. هر دریافت کننده ای که قصد ایجاد آن را دارید باید در فایل AndroidManifest.xml با استفاده از تگ |
5 | ویرایش محتویات پیش فرض فایل res/layout/activity_main.xml به منظور افزودن یک دکمه برای انتشار پیام. |
6 | نیازی به تغییر محتویات فایل string.xml نمی باشد. |
7 | اجرای برنامه ایجاد شده درون شبیه سازی اندروید برای مشاهده نتیجه کار. |
در زیر محتویات اصلاح شده فایل MainActivity.java را مشاهده می کنید. این فایل می تواند شامل هر یک از متد های مربوط به چرخه حیات برنامه باشد. ما متد broadcastIntent() را انتشار پیام سفارشی به این فایل اضافه کرده ایم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 را نشان می دهد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 را در زیر مشاهده می کنید. که با استفاده از تگ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?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 می باشد که یک دکمه جدید برای انتشار پیام سفارشی به آن اضافه کرده ایم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | <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> |
خوب حالا برنامه ای که ایجاد کرده ایم را اجرا می کنیم. ما فرض می کنیم شما AVD (Android Virtual Device) خود را حین تنظیم محیط برنامه نویسی اندروید ایجاد کرده اید. به منظور اجرای برنامه در اندروید استودیو، یکی از فایل های activity برنامه را باز کنید سپس بر روی نماد اجرا () کلیک کنید. اندروید استودیو این برنامه را در AVD نصب کرده و آن را اجرا می کند و اگر همه چیز به درستی تنظیم شده باشد، یک پنجره شبیه ساز مانند شکل زیر نمایش داده خواهد شد:
بعد از اجرا شدن برنامه یک دکمه با نام BROADCAST INTENT را مشاهده می کنید که با کلیک بر روی آن یک پیام با ثابت “com.tutorialspoint.CUSTOM_INTENT” در سیستم منتشر می شود و اگر برنامه ای برای این پیام دریافت کننده ای ثبت کرده باشد می تواند به آن واکنش دهد.
شما می توانید دریافت کننده های دیگری به منظور پاسخ به پیام های سیستم مانند بوت شدن سیستم، تغییر در تاریخ و غیره ایجاد کنید.
هیچ نظری ثبت نشده است