Broadcast Receivers
به سادگی به پیام های پخش شده از برنامه های دیگر یا از خود سیستم پاسخ می دهد. این پیام ها گاهی اوقات رویداد (event) و یا مفهوم (intent) نامیده می شوند. به عنوان مثال، اپلیکیشن ها می توانند برای خبر دادن به سایر اپلیکیشن ها، که برخی داده ها در دستگاه دانلود شده و آماده استفاده هستند، پیام هایی را شروع به ارسال کنند. این broadcast receiver (دریافت کننده پیام پخش شده) است که این ارتباطات را شنود کرده و اقدام مناسب را شروع می کند.
در پایین دو مرحله برای کار کردن BroadcastReciever در رابطه با مفاهیم (intents) پخش شده آمده است:
ایجاد گیرنده پخش (Broadcast Receiver)
ثبت کردن گیرنده پخش (Broadcast Receiver)
یک گام اضافی نیز در حالتی که شما ایجاد مفاهیم (intents) سفارشی خود را دارید وجود دارد. در این صورت شما آن مفاهیم (intents) را ایجاد کرده و پخش کنید.
ایجاد گیرنده پخش Broadcast Receiver
گیرنده پخش (broadcast receiver) به عنوان یک زیر کلاس از کلاس BroadcastReciever پیاده سازی شده است و متد onRecieve () را override می کند. به طوری که هر پیام به صورت یک پارامتر شی 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 به مفاهیم منتشر شده خاصی گوش می دهد. در نظر بگیرید که قصد داریم 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 شنود می شود و منطق پیاده سازی شده در متد onRecieve ()اجرا خواهد شد.
چندین رویداد تولید شده بوسیله سیستم وجود دارد که به عنوان فیلدهای استاتیک نهایی در کلاس Intent تعریف می شوند. جدول زیر لیست چند رویداد مهم سیستمی است.
ثابت مربوط به رویداد | توصیف |
android.intent.action.BATTERY_CHANGED |
این پیغام Sticky broadcast حاوی وضعیت و سطح شارژ و اطلاعات دیگری در مورد باتری است. |
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 را برای رفتن به شماره گیر یا یک واسط کاربری مناسب دیگر جهت برقراری تماس فشار می دهد. |
android.intent.action.DATE_CHANGED | برای نشان دادن تغییر داده است |
android.intent.action.REBOOT | برای نشان دادن راه اندازی مجدد سیستم (reboot) است |
پخش intent های سفارشی (Broadcasting Custom Intents)
اگر می خواهید اپلیکیشن شما خودش intents های سفارشی را تولید و ارسال کند، شما باید این intents ها را با با استفاده از متد 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>
مثال:
این مثال به شما توضیح می دهد که چگونه می توانید BroadcastReciever را برای شنود intent سفارشی ایجاد کنید. زمانی که شما با intent سفارشی آشنا شدید، می توانید اپلیکیشن خود را برای شنود intent های تولید شده سیستم برنامه نویسی کنید. حال مراحل زیر را برای تغییر اپلیکیشن اندرویدی که در بخش Hello World Example ایجاد کرده ایم دنبال کنید.
مرحله | توصیف |
۱ | از آندروید استودیو برای ایجاد یک اپلیکیشن آندروید استفاده کنید و نام آن را My Application تحت پکیج com.example.My Application بنامید. همانطور که در بخش Hello World Example توضیح داده شده است. |
۲ | فایل فعالیت اصلی MainActivity.java را برای اضافه کردن متد broadcastIntent() اصلاح کنید. |
۳ | برای تعریف BroadcastReceiver، یک فایل جاوای جدید با نام MyReceiver.java تحت پکیج com.example.My Application ایجاد کنید. |
۴ | یک اپلیکیشن می تواند با یک یا تعداد بیشتری intent سفارشی یا سیستمی بدون هیچ گونه محدویتی کار کند. هر intent که شما مایا به شنود آن هستید باید در فایل AndroidManifest.xml تان با استفاده از تگ <receiver…/> ثبت شود. |
۵ | محتوای پیش فرض فایل res/layout/activity_main.xml را طوری تغییر دهید که شامل یک دکمه برای انتشار intent باشد. |
۶ | نیازی به تغییر فایل string وجود ندارد، Android studio از فایل string.xml مراقبت می کند. |
۷ | برای راه اندازی Android emulator اپلیکیشن را اجرا کنید و نتایج تغییرات اعمال شد در اپلیکیشن را بررسی کنید. |
در زیر محتوای تغییر یافته فایل اصلی src/com.example.My Application/MainActivity.java است. این فایل می تواند شامل هر یک از متدهای اساسی چرخه حیات باشد. ما متد broadcastIntent () را برای پخش یک intent سفارشی اضافه کرده ایم.
package com.example.My Application; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.content.Intent; import android.view.View; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } // broadcast a custom intent. public void broadcastIntent(View view){ Intent intent = new Intent(); intent.setAction("com.tutorialspoint.CUSTOM_INTENT"); sendBroadcast(intent); } }
در زیر محتوای src/com.example.My Application/MyReceiver.java آورده شده است:
package com.example.My Application; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show(); } }
در زیر محتوای اصلاح شده فایل AndroidManifest.xml آورده شده است. در اینجا ما تگ را برای وارد کردن سرویس مان اضافه کرده ایم:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.My Application" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="22" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <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>
در زیر محتوای فایل res / values / strings.xml برای تعریف دو ثابت جدید آورده شده است:
<resources> <string name="menu_settings">Settings</string> <string name="title_activity_main">My Application</string> </resources>
اکنون می خواهیم اپلیکیشن تغییر یافته Hello World! را اجرا کنیم. فرض می کنیم که شما AVD خود را در زمان نصب محیط ایجاد کرده باشید. برای اجرای برنامه از اندروید استودیو، یکی از فایل های فعالیت پروژه خود را باز کنید و بر روی آیکون از نوار ابزار کلیک کنید. اندروید استودیو app را روی AVD شما نصب و آن را شروع می کند و اگر همه چیز با تنظیمات و اپلیکیشن شما درست باشد، پنجره ی Emulator زیر برای شما نمایش داده خواهد شد.
حال برای پخش intent سفارشی مان، بر روی دکمه Broadcast Intent کلیک کنید، این کار intent سفارشی ما “com.tutorialspoint.CUSTOM_INTENT” را منتشر می کند، این intent بوسیله BroadcastReciever ثبت شده ما یعنی MyReceiver شنود می شود و با توجه به منطق پیاده سازی شده ما عبارت detectIntent در پایین صفحه ظاهر شبیه ساز بصورت زیر نمایش داده می شود.
شما اکنون می توانید سایر BroadcastReciever ها را برای شنود intent های ایجاد شده توسط سیستم مانند بوت شدن سیستم (system boot up)، تاریخ تغییر (date changed)، باتری کم (low battery)و غیره امتحان کنید.