گیرنده های اعلام
گیرنده های اعلام یا (Broadcast Receivers) به پیام هایی که از طرف نرم افزار های دیگر یا سیستم عامل به سایر نرم افزار ها اعلام می شوند پاسخ می دهند. برای مثال نرم افزار ها می توانند پیام هایی را ارسال کنند که طی آن به سایر نرم افزارها اعلام می شود داده ای دانلود شده و آن ها اجازه دارند از آن استفاده کنند. در این هنگام گیرنده های اعلام پیام را دریافت، شناسایی نموده و به آن واکنش نشان می دهند.
در زیر دو مرحله ی مهم که باعث می شود گیرنده ی اعلام در مواجه با پیام های اعلام شده از طرف سیستم واکنش نشان دهد آورده شده است :
- ایجاد گیرنده اعلام
- ثبت گیرنده اعلام
یک گام اضافی برای زمانی که شما قصد دارید یک پیام را به روش دلخواه خودتون اجرا کنید، که مجبور به پیاده سازی سیستم اعلام آن پیام نیز خواهید بود.
ایجاد گیرنده اعلام
یک گیرنده اعلام به عنوان یک زیر کلاس از کلاس BroadcastReceiver اجرا می شود و از آنجایی که هر پیام به عنوان یک پارامتر Intent دریافت می شود استفاده از روش ()onReceive اجتناب ناپذیر خواهد بود.
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show(); } }
مطلب پیشنهادی: سازماندهی و دسترسی به منابع اندروید
ثبت گیرنده اعلام
گیرنده های اعلام یک نرم افزار، با ثبت شدن در فایل AndroidManifest.xml 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 شناسایی خواهد شد و کد های پیاده سازی شده در داخل متد ()onReceive اجرا می شود.
چندین رویداد تولید شده به وسیله ی سیستم وجود دارند که به عنوان یک فیلد نهایی (final static field) در کلاس 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
مشکل (bug) در یک اکتیویتی را اعلام می کند. |
۶ | android.intent.action.CALL
انجام تماس با داده های مشخص را اعلام می کند. |
۷ | android.intent.action.CALL_BUTTON
فشرده شدن دکمه ی “call” را برای رفتن به صفحه ی شماره گیر یا صفحه ی انجام تماس اعلام می کند. |
۸ | android.intent.action.DATE_CHANGED
تغییر تاریخ را اعلام می کند. |
۹ | android.intent.action.REBOOT
راه اندازی مجدد سیستم را اعلام می کند. |
اعلام در پیام های سفارشی
اگر می خواهید نرم افزار شما به طور خودکار پیام ها را تولید و اعلام کند؛ لازم است برای ایجاد و اعلام پیام، از متد ()sendBroadcast در داخل کلاس اکتیویتی برنامه ی خودتان استفاده کنید. اگر شما برای ساخت و اعلام، از متد sendStickyBroadcast(Intent) استفاده کنید، پیام شما چسبنده (Sticky) خواهد بود، یعنی پیامی که شما در حال ارسال آن هستید پس از آن که به تمام قسمت ها اعلام شود در محیط باقی خواهد می ماند.
public void broadcastIntent(View view) { Intent intent = new Intent(); intent.setAction("com.tutorialspoint.CUSTOM_INTENT"); sendBroadcast(intent); }
پیام com.startingpoint.CUSTOM_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>
مطلب پیشنهادی: بررسی اجمالی و تاریخچه اندروید
مثال
این مثال نحوه ی ساختن یک گیرنده ی اعلام را به منظور شناسایی یک پیام سفارشی توضیح خواهد داد. اگر شما با پیام های سفارشی آشنا باشید آنگاه می توانید پیام های تولید شده توسط سیستم را شناسایی و واکنشی را متناسب با آن پیاده سازی کنید. حال اجازه دهید مانند مطالب قبل با دنبال کردن مراحل زیر، گیرنده های اعلام را در مثال Hello World بررسی کنیم:
مرحله | Description |
۱ | با استفاده از Android studio یک پروژه ی جدید ایجاد کنید و مانند آنچه در مثال Hello World توضیح داده شد نام آن را Broadcast Receivers تحت بسته ی com.example.broadcast.receivers تعیین کنید. |
۲ | فایل اصلی اکتیویتی یعنی MainActivity.java را تغییر داده و متد broadcastIntent() را به آن اضافه کنید. |
۳ | برای تعریف یک گیرنده اعلام، یک فایل جاوا با نام MyReceiver.java در زیرشاخه ی بسته com.example.broadcast.receivers پروژه، ایجاد کنید. |
۴ | یک نرم افزار بدون هیچ محدودیتی می تواند یک یا چندین پیام سفارشی و پیام سیستمی را مدیریت کنید. شما باید اعلام های هر پیامی را که می خواهید شناسایی شود را در فایل AndroidManifest.xml برنامه با استفاده از تگ <receiver…/> ثبت کنید. |
۵ | محتوای پیش فرض فایل res/layout/activity_main.xml را برای افزودن یک دکمه که اعلام کننده ی پیام هست تغییر دهید. |
۶ | رشته های مورد نیاز برنامه را به فایل res/values/strings.xml اضافه کنید. |
۷ | نرم افزار را با استفاده از شبیه ساز دستگاه اندروید اجرا و نتیجه را مورد بررسی قرار دهید. |
در زیر محتوای تغییر یافته ی فایل MainActivity.java. آورده شده است. این فایل می تواند هر کدام از متدهای اساسی چرخه حیات را شامل شود. ما متد broadcastIntent() را برای اعلام یک پیام سفارشی به فایل افزوده ایم.
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; /** * 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 را مشاهده می کنید. در این جا با استفاده از تگ <receiver…/> گیرنده ی اعلام تعریف شده است:
<?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 را مشاهده می کنید که شامل یک دکمه برای اعلام پیام است
<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، یکی از فایل های فعالیت پروژه خود را باز کنید و از نوار ابزار روی نماد اجرا کلیک کنید. Android studio این برنامه را در AVD خود نصب می کند و آن را اجرا می کند و اگر همه چیز تنظیم و برنامه شما بدون مشکل باشد، پنجره بعدی Emulator را نمایش می دهد:
اکنون برای اعلام کردن پیامی که ساخته ایم، بر روی دکمه Broadcast Intent کلیک میکنیم، این باعث اعلام شدن پیام “com.tutorialspoint.CUSTOM_INTENT” می شود، که توسط BroadcastReceiver ثبت شده. هر بار که گیرنده MyReceiver فعالیت کند، یک پیام در پایین شبیه ساز نمایش داده خواهد شد؛ مانند تصویر شبیه ساز زیر است:
در ادامه شما می توانید سعی کنید سایر گیرنده های اعلام ها را نظیر بوت شدن سیستم، تغییر تاریخ، ضعیف بودن باتری و … را برای شناسایی پیام های تولید شده در سیستم، پیاده سازی کنید.
منبع: tutorialspoint