برودکست ریسیور ها (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 به اینتنت های یک برودکست خاص گوش می دهد. در نظر داشته باشید که ما قصد داریم کلاس MyReceiver را برای رویداد ACTION_BOOT_COMPLETED که توسط سیستم تولید می شود و زمانی که روند بارگذاری سیستم اندروید کامل شد (بعد از روشن شدن گوشی) برودکست می شود ، ثبت کنیم.

 

برودکست ریسیور - Broadcast Receiver
برودکست ریسیور – Broadcast Receiver

 

<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 در کلاس Intent تعریف شده اند. جدول زیر چند تا از رویداد های سیستمی مهم را نشان می دهد.

شماره  فبلد ثابت رویداد و توضیحات
۱ android.intent.action.BATTERY_CHANGED

این برودکست از نوع چسبنده یا sticky است و مربوط به وضعیت شارژ ، سطح و اطلاعات دیگر باتری می باشد.

۲ 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

درخواست ری بوت یا روشن خاموش شدن دستگاه.

برودکست کردن اینتنت سفارشی

اگر میخواهید اپلیکیشنتان خود اینتنت سفارشی تولید و ارسال کند، باید ان اینتنت را ایجاد و به وسیله متد sendBroadcast() که در کلاس اکتیویتی شما قرار دارد آن را ارسال کنید. اگر از متد sendStickyBroadcast(Intent) استفاده کنید اینتنت چسبنده یا sticky خواهد بود به این معنی که اینتنتی که شما با این متد ارسال می کنید بعد از تکمیل شدن ارسال باز هم برای دریافت توسط برودکست ریسیور های ثبت شده در آینده در سیستم باقی می ماند.

 

public void broadcastIntent(View view) {
   Intent intent = new Intent();
   intent.setAction("com.app2app.CUSTOM_INTENT");
   sendBroadcast(intent);
}
 

اینتنت com.app2app.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.app2app.CUSTOM_INTENT">
         </action>
      </intent-filter>
   
   </receiver>
</application>

 

مثال

این مثال به شما توضیح می دهد که چطور یک برودکست ریسیور برای دریافت اینتنت سفارشی ایجاد کنید. وقتی با اینتنت های سفارشی آشنا شدید، می توانید برنامه ای برنامه ای بنویسید که اینتنت های تولید شده توسط سیستم را هم دریافت کند. پس گام های زیر را برای ویرایش اپلیکیشنی  که در آموزش Hello world ایجاد کردیم را دنبال کنید.

گام توضیح
۱ ایجاد یک پروژه اپلیکیشن اندروید  در اندروید استدیو و نامگذاری آن به MyApplication و پکیجش به com.example.app2app.myapplication ، همانطور که در آموزش Hello World توضیح داده شد.
۲ ویرایش فایل MainActivity.java برای اضافه کردن متد broadcastIntent().
۳ ایجاد یک فایل جاوای جدید در پکیج com.example.app2app.myapplication به نام MyReceiver.java برای تعریف یک برودکست ریسیور.
۴ یک اپلیکیشن می تواند یک یا بیشتر از یک اینتنت سفارشی و سیستمی را بدون هیچ محدودتی پشتیبانی کند. هر اینتنتی که می خواهید دریافت کنید باید با استفاده از تگ  <receiver…/>  در فایل AndroidManifest.xml اپلیکیشن ثبت کنید.
۵ ویرایش کدهای پیش فرض فایل res/layout/activity_main.xml  برای قرار دادن دکمه ای برای برودکست کردن اینتنت.
۶ نیازی به تغییر هیچ چیزی در فایل res/values/strings.xml نیست. اندروید استدیو مقادیر این فایل را مدیریت می کند.
۷ اپلیکیشن را روی گوشی اجرا کنید و تغییرات ایجاد شده در اپلیکیشن را بررسی کنید.

 

در زیر کد ویرایش شده فایل MainActivity.java یا همان اکتیویتی اصلی را می بینید.
این فایل می تواند شامل هر کدام از متد های اساسی چرخه ی اجرا باشد. ما متد broadcastIntent()  را برای برودکست کردن یک اینتنت سفارشی به آن اضافه کرده ایم.

 

package com.example.app2app.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.app2app.CUSTOM_INTENT"); sendBroadcast(intent);
   }
}

در زیر کد های موجود در فایل MyReceiver.java را می بینید.

 

package com.example.app2app.myapplication;

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 را می بینید. در اینجا ما تگ <receiver…/> را برای ثبت برودکست ریسیور اضافه کرده ایم.

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.app2app.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.app2app.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 را اجرا کنیم. برای اجرای اپلیکیشن، در اندروید استدیو یکی از فایل های اکتیویتی پروژه را باز کنید و بر روی آیکن Run دکمه Run که در تولبار قرار دارد کلیک کنید. اندروید استدیو اپلیکیشن را بر روی گوشی نصب کرده، و اگر همه ی کارها را درست انجام داده باشید برنامه در صفحه گوشی اپلیکیشن را مانند شکل زیر خواهید دید.

مثال برودکست ریسیور - Example of Broadcast Receiver

 

حالا برای برودکست کردن اینتنت سفارشی مان، باید روی دکمه Broadcast Intent کلیک کنیم. با این کار اینتنت com.app2app.CUSTOM_INTENT برودکست شده و توسط برودکست ریسیور ثبت شده مان دریافت می شود و طبق کدی که در  MyReceiver نوشتیم، یک پیام شناور در زیر صفحه گوشی ظاهر خواهد شد. این موضوع را در شکل زیر می بینید.

مثال برودکست ریسیور - Example of Broadcast Receiver

 

شما می توانید سعی کنید برودکست ریسیور های دیگری برای دریافت اینتنت های تولید شده توسط سیستم مثل اینتنت boot، تغییر تاریخ، وضعیت باتری و …. پیاده سازی کنید.

امید فرجی

سلام، امید فرجی هستم از همدان. بیشتر از 7 سال میشه که در حوضه برنامه نویسی جاوا و اندروید فعالیت دارم و در این مدت پروژه های تجاری مختلفی انجام دادم. همچنین از سال 91 سایت آموزش تخصصی جاوا را راه اندازی کردم و در خدمت شما هستم. امیدوارم مفید بوده باشم. برای سفارش پروژه هاتون باهام تماس بگیرید.

شما ممکن است این را هم بپسندید

۲ پاسخ‌ها

  1. hasan گفت:

    سلام مهندس. آموزشات حرف نداره. خیلی خوشحالم دوباره سایت رو راه انداختی.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

اگر به دنبال پروژه های آماده هستید از فروشگاه ما دیدن کنید رد کردن