مشخصات مقاله
بهره گیری از Broadcast Receivers در اندروید
بهره گیری از Broadcast Receivers در اندروید
این فصل از سری مقاله آموزشی مبحث نحوه ی تولید و مصرف سرویس های اندروید را برای شما بسط می دهد . بر پایه ی Eclipse 4.3, Java 1.6 و Android 4.2 نوشته شده است.
فهرست محتوا
1. Broadcast receiver
- Broadcast receiver چیست و چه کاربردی دارد ؟
- پیاده سازی
- چرخه ی حیات Broadcast receiver
- پردازش ناهمگام
- محدودیت هایی که در ایجاد Broadcast receiver با آن مواجه می شویم
2. System broadcasts
3. راه اندازی خودکار سرویس ها از receiver ها
4. Pending Intent چیست و چه قابلیتی دارد ؟
5. تمرین : تعریف receiver برای تغییرات گوشی
- اهداف تمرین
- ایجاد پروژه تمرین
- پیاده سازی receiver
- تست و اجرای برنامه
6. تمرین : System service ها و receiver ها
- هدف تمرین
- پیاده سازی پروژه
- کسب اطمینان از کارکرد صحیح برنامه
7. معرفی رخدادهای سفارشی و receiver ها
- ثبت broadcast receiver برای رویدادهای اختصاصی
- ارسال broadcast intents
- رخدادهای محلی broadcast با LocalBroadcastManager
8. ثبت پویای broadcast receiver
- ثبت receiver به صورت پویا
- استفاده از کلاس package manager برای غیرفعال کردن receiver های ایستا
- Sticky (broadcast) intents
Broadcast receiver
Broadcast receiver چیست و چه کاربردی دارد ؟
broadcast receiver (که مخفف آن receiver می باشد) یک مولفه ی اندروید است که به شما اجازه می دهد برای رخدادهای اپلیکیشن ها و سیستم رجیستر کنید (receiver یکی از اجزإ اندروید است که برای تغییرات orientation مانند پیامک های دریافت شده, تماس های گرفته شده, جواب داده شده و قطع شده, تغییرات وضعیت باتری و هنگامی که wi-fi روشن می شود و غیره ... گوش فراخوانی قرار داده و رجیستر می کند; در واقع broadcast receiver به پیام های پخش و ارسال شده از دیگر اپلیکیشن ها پاسخ می دهد) . کلیه ی receiver های ثبت شده ویژه ی رویداد مورد نظر توسط android runtime (به محض اینکه این اتفاق رخ می دهد) مطلع می گردند .
برای مثال, برنامه های کاربردی می توانند برای رخداد سیستم ACTION_BOOT_COMPLETED رجیستر کنند که تنها زمانی راه اندازی می شود که سیستم اندروید پروسه بالا آمدن را تکمیل کرده باشد .
پیاده سازی
می توان یک receiver را از طریق / در فایل AndroidManifest.xml ثبت (register) کرد .
متناوباً می توان بجای این این نوع ثبت ایستا (static registration), receiver را به وسیله ی متد Context.registerReceiver() به صورت پویا (dynamic registeration) به ثبت رساند .
کلاسی که receiver را پیاده سازی می کند, کلاس BroadcastReceiver را به ارث می برد .
اگر آن رویدادی که broadcast receiver ویژه ی آن رجیستر شده رخ دهد, تابع onReceive() گیرنده (receiver) توسط سیستم اندروید صدا زده می شود .
چرخه ی حیات Broadcast receiver
پس از اینکه تابع onReceive() کلاس receiver عملیات را به اتمام رساند, این اجازه به سیستم اندروید داده می شود که receiver را بازسازی یا بازیافت (recycle) کند .
پردازش ناهمگام
پیش از رابط برنامه سازی کاربردی 11 (API), برنامه نویس نمی توانست هیچ عملیات ناهمگامی در متد onReceive ()اجرا کند, به این خاطر که مجرد پایان رسیدن متد onReceive (), سیستم اندروید اجازه داشت مولفه ی مورد نظر را بازسازی کند . در صورت در دست داشتن عملیات طولانی, توصیه می شود (بجای گزینه ی فوق) حتماً یک سرویس راه اندازی کنید .
از API 11, این امکان برای برنامه نویس فراهم شده که متد goAsync() را فراخوانی کند . این متد شئی از نوع PendingResult را برمی گرداند . سیستم اندروید تا زمانی که تابع PendingResult.finish() برای شئ مذکور فراخوانی نشده, این شئ را فعال در نظر می گیرد . با بهرگیری از گزینه مزبور امکان راه اندازی پردازش ناهمگام در receiver فراهم می شود . بلافاصله پس از اینکه نخ عملیاتش به پایان رسید, تسک تابع finish () را فراخوانی می کند تا به سیستم اندروید نشان دهد که مولفه یا کامپوننت مورد نظر قابلیت بازیافت (recycle) را دارد .
محدودیت هایی که در ایجاد Broadcast receiver با آن مواجه می شویم
از ویرایش 3.1 به بعد, سیستم اندروید در صورتی که برنامه ی مربوطه هیچگاه توسط کاربر راه اندازی نشده یا کاربر اپلیکیشن را خود صریحاً از طریق منو اندروید (Manage → Application) متوقف کرده باشد, به صورت پیش فرض مانع از این می شود که گیرنده ها (receiver), intent ها را دریافت کنند .
این در واقع یک ویژه گی امنیتی اضافه بر سازمان محسوب می شود, زیرا که به واسطه ی آن کاربر می تواند مطمئن باشد که تنها اپلیکیشن هایی که خود راه اندازی کرده گیرنده ی broadcast intent ها خواهند بود .
این امر بدین معنا نیست که کاربر مجبور است برنامه ی کاربردی را مجدداً پس از بازآغازی (reboot) راه اندازی کند . سیستم اندروید خود به خاطر دارد که کاربر برنامه ی مورد نظر را پیشتر راه اندازی کرده است . تنها یکبار راه اندازی توسط کاربر البته بدون متوقف سازی ناگهان (توسط کاربر) کفایت می کند .
System broadcasts
برخی از رویدادهای سیستم (system events) به عنوان فیلدهای ایستای نهایی (final static fields) در کلاس Intent تعریف می شوند . دیگر کلاس های سیستم اندروید نیز رخداد تعریف می کنند, به عنوان مثال TelephonyManager ویژه ی تغییرات وضعیت گوشی (که در وضعیت گوشی رخ می دهد) رویدادهای معینی معرفی می کند .
جدول ذیل تعداد متعددی از رخدادهای سیستم را برای شما فهرست کرده است .
جدول 1. رویدادهای سیستم
راه اندازی خودکار سرویس ها از receiver ها
یکی از الزامات مشترک این است که یک سرویس پس از خودراه اندازی مجدد سیستم (reboot) به صورت خودکار راه اندازی شود, برای مثال می توان به همگام سازی داده اشاره کرد . برای این منظور می توان یک receiver برای رخداد سیستم android.intent.action.BOOT_COMPLETED ثبت کرد, این امر مستلزم مجوز android.permission.RECEIVE_BOOT_COMPLETED می باشد .
مثال زیر ثبت رویداد BOOT_COMPLETED را در فایل مانیفست اندروید نمایش می دهد .
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 | <!--?xml version= "1.0" encoding= "utf-8" ?--> <manifest xmlns:android= "http://schemas.android.com/apk/res/android" package = "de.vogella.android.ownservice.local" android:versioncode= "1" android:versionname= "1.0" > <uses-sdk android:minsdkversion= "10" ></uses-sdk> <uses-permission android:name= "android.permission.RECEIVE_BOOT_COMPLETED" ></uses-permission> <application android:icon= "@drawable/icon" android:label= "@string/app_name" > <activity android:name= ".ServiceConsumerActivity" android:label= "@string/app_name" > <intent-filter> <action android:name= "android.intent.action.MAIN" ></action> <category android:name= "android.intent.category.LAUNCHER" ></category> </intent-filter> </activity> <receiver android:name= "MyScheduleReceiver" > <intent-filter> <action android:name= "android.intent.action.BOOT_COMPLETED" ></action> </intent-filter> </receiver> <receiver android:name= "MyStartServiceReceiver" > </receiver> </application> </manifest> <button></button> |
Receiver سرویس را همان گونه که در کد زیر نمایش داده شده راه اندازی می کند.
1 2 3 4 5 6 7 8 9 10 11 12 | import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // assumes WordService is a registered service Intent intent = new Intent(context, WordService. class ); context.startService(intent); } } <button></button> |
در صورتی که برنامه ی مورد نظر روی حافظه ی sd نصب شده باشد, دیگر پس از رخداد android.intent.action.BOOT_COMPLETED در دسترس نخواهد بود . در چنین شرایطی برنامه را برای رویداد android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE ثبت کنید .
به خاطر داشته باشید که از رابط برنامه سازی کاربردی 11 به بعد اندروید, کاربر باید حتماً یکبار برنامه ی کاربردی را پیش از اینکه اپلیکیشن بتواند intent را دریافت کند, راه اندازی کرده باشد .
Pending Intent چیست و چه قابلیتی دارد ؟
pending intent یک نشانه یا علامت (token) است که شما با دادن آن به برنامه دیگر (از جمله notification manager,alarm manager و دیگر برنامه های جانبی یا شخص ثالث), به برنامه ی مذکور اجازه می دهید جهت اجرای کد از پیش تعریف شده از مجوزهای برنامه ی شما استفاده کند .
به منظور اجرای یک broadcast (فرایند پخش) از طریق pending intent, یک PendingIntent به وسیله ی تابع getBroadcast() از کلاس PendingIntent دریافت کنید . جهت اجرای یک activity از طریق pending intent, باید activity مربوطه را با استفاده از تابع PendingIntent.getActivity() دریافت کنید .
تمرین : تعریف receiver برای تغییرات گوشی
اهداف تمرین
در این تمرین به ایجاد یک broadcast receiver می پردازیم که وظیفه ی آن گوش فراخوانی به تغییرات وضعیت گوشی می باشد . در صورت دریافت تماس تلفنی توسط گوشی, receiver مطلع گشته و به دنبال آن یک پیغام ثبت می کند .
ایجاد پروژه تمرین
ابتدا پروژه ی جدیدی به نام de.vogella.android.receiver.phone ایجاد کنید, سپس یک activity ایجاد کنید .
نکته : بیاد داشته باشید که receiver شما تنها زمانی صدا زده می شود که کاربر قبلاً یکبار آن را راه اندازی کرده باشد, برای این امر یک activity مورد نیاز می باشد .
پیاده سازی receiver
کلاس MyPhoneReceiver را ایجاد کنید .
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 | package de.vogella.android.receiver.phone; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.telephony.TelephonyManager; import android.util.Log; public class MyPhoneReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle extras = intent.getExtras(); if (extras != null ) { String state = extras.getString(TelephonyManager.EXTRA_STATE); Log.w( "MY_DEBUG_TAG" , state); if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { String phoneNumber = extras .getString(TelephonyManager.EXTRA_INCOMING_NUMBER); Log.w( "MY_DEBUG_TAG" , phoneNumber); } } } } <button></button> |
مجوز android.permission.READ_PHONE_STATE را به فایل مانیفست خود اضافه کنید, با انجام این کار شما می توانید در receiver خود به تغییرات وضعیت (state change) گوش فرا دهید . توجه داشته باشید که باید receiver خود را در فایل مانیفست ثبت کنید :
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 | <!--?xml version= "1.0" encoding= "utf-8" ?--> <manifest xmlns:android= "http://schemas.android.com/apk/res/android" package = "de.vogella.android.receiver.phone" android:versioncode= "1" android:versionname= "1.0" > <uses-sdk android:minsdkversion= "15" ></uses-sdk> <uses-permission android:name= "android.permission.READ_PHONE_STATE" > </uses-permission> <application android:icon= "@drawable/icon" android:label= "@string/app_name" > <activity android:name= ".MainActivity" android:label= "@string/title_activity_main" > <intent-filter> <action android:name= "android.intent.action.MAIN" ></action> <category android:name= "android.intent.category.LAUNCHER" ></category> </intent-filter> </activity> <receiver android:name= "MyPhoneReceiver" > <intent-filter> <action android:name= "android.intent.action.PHONE_STATE" > </action> </intent-filter> </receiver> </application> </manifest> <button></button> |
تست و اجرای برنامه
برنامه ی خود را نصب کرده و با استفاده از DDMS perspective در Eclipse یک تماس تلفنی را شبیه سازی کنید . اطمینان کسب کنید receiver شما فراخوانده شده و یک پیغام را در LogCat view ثبت (log) کند .
(Dalvik Debug Monitor Server perspective، یک ابزار اشکال زدایی که به مثابه ی یک واسط بین محیط برنامه نویسی و برنامه های کاربردی که در دستگاه در حال اجرا هستند عمل می کند. کار perspective این است که عملیات قابل رویت و view های داخل یک پنجره را مشخص می کند .)
تمرین : System service ها و receiver ها
در این تمرین با استفاده از alert manager (سرویس سیستم اندروید), یک receiver را زمان بندی می کنیم. پس از فراخوانی, با استفاده از vibrator manager اندروید و popup message (toast) کاربر را مطلع می سازد .
پیاده سازی پروژه
پروژه ای به نام de.vogella.android.alarm ایجاد کرده و activity آن را AlarmActivity نام گذاری کنید.
سپس, طرح کلی (layout) زیر را ایجاد کنید.
1 2 3 4 5 6 7 8 9 | <!--?xml version= "1.0" encoding= "utf-8" ?--> <linearlayout xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width= "match_parent" android:layout_height= "match_parent" android:orientation= "vertical" > <edittext android:id= "@+id/time" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:hint= "Number of seconds" android:inputtype= "numberDecimal" > </edittext> <button android:id= "@+id/ok" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:onclick= "startAlert" android:text= "Start Counter" > </button> </linearlayout> <button></button> |
حال کلاس broadcast receiver زیر را ایجاد کنید . این کلاس vibrator service را می گیرد .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package de.vogella.android.alarm; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Vibrator; import android.widget.Toast; public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Don't panik but your time is up!!!!." , Toast.LENGTH_LONG).show(); // Vibrate the mobile phone Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); vibrator.vibrate( 2000 ); } } <button></button> |
این کلاس را به عنوان یک broadcast receiver در AndroidManifest.xml ثبت کرده و اجازه ی لرزش یا ویبره ی گوشی را درخواست (request) کنید .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <!--?xml version= "1.0" encoding= "utf-8" ?--> <manifest xmlns:android= "http://schemas.android.com/apk/res/android" package = "de.vogella.android.alarm" android:versioncode= "1" android:versionname= "1.0" > <uses-sdk android:minsdkversion= "15" ></uses-sdk> <uses-permission android:name= "android.permission.VIBRATE" > </uses-permission> <application android:icon= "@drawable/icon" android:label= "@string/app_name" > <activity android:name= ".AlarmActivity" android:label= "@string/app_name" > <intent-filter> <action android:name= "android.intent.action.MAIN" ></action> <category android:name= "android.intent.category.LAUNCHER" ></category> </intent-filter> </activity> <receiver android:name= "MyBroadcastReceiver" > </receiver> </application> </manifest> <button></button> |
کد کلاس AlarmActivity را به زیر تغییر دهید . این activity برای راه اندازی receiver یک intent ایجاد کرده و intent را با سرویس alarm manager ثبت می کند .
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 | package de.vogella.android.alarm; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class AlarmActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); } public void startAlert(View view) { EditText text = (EditText) findViewById(R.id.time); int i = Integer.parseInt(text.getText().toString()); Intent intent = new Intent( this , MyBroadcastReceiver. class ); PendingIntent pendingIntent = PendingIntent.getBroadcast( this .getApplicationContext(), 234324243 , intent, 0 ); AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (i * 1000 ), pendingIntent); Toast.makeText( this , "Alarm set in " + i + " seconds" , Toast.LENGTH_LONG).show(); } } <button></button> |
کسب اطمینان از کارکرد صحیح برنامه
برنامه ی خود را در دستگاه اجرا و راه اندازی کنید . زمان را تنظیم کرده و هشدار (alarm) را راه اندازی کنید. پس از گذشت زمان مشخص (تعداد ثانیه های مشخص(, یک Toast نمایش داده می شود . بیاد داشته باشید که هشدار لرزشی به دلیل عدم وجود قابلیت آن در شبیه ساز, کار نمی کند.

معرفی رخدادهای سفارشی و receiver ها
ثبت broadcast receiver برای رویدادهای اختصاصی
می توان برای action های سفارشی خود receiver ثبت کرد.
فایل AndroidManifest.xml زیر broadcast receiver ی را نمایش می دهد که برای action سفارشی ثبت می شود.
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 = "de.vogella.android.receiver.own" android:versioncode= "1" android:versionname= "1.0" > <uses-sdk android:minsdkversion= "15" ></uses-sdk> <application android:icon= "@drawable/ic_launcher" android:label= "@string/app_name" > <activity android:name= ".MainActivity" android:label= "@string/app_name" > <intent-filter> <action android:name= "android.intent.action.MAIN" ></action> <category android:name= "android.intent.category.LAUNCHER" ></category> </intent-filter> </activity> <receiver android:name= "MyReceiver" > <intent-filter> <action android:name= "de.vogella.android.mybroadcast" ></action> </intent-filter> </receiver> </application> </manifest> <button></button> |
ارسال broadcast intents
متد sendBroadcast() مشتق از کلاس Context به شما اجازه می دهد به receiver های ثبت (رجیستر) شده, intent ارسال کنید . کد زیر این امر را با مثال نمایش می دهد .
1 2 3 4 | Intent intent = new Intent(); intent.setAction( "de.vogella.android.mybroadcast" ); sendBroadcast(intent); <button></button> |
نمی توان رخدادهای broadcast سیستم را فعال سازی یا فراخوانی کرد, سیستم اندروید از وقوع این امر جلوگیری خواهد کرد .
receiver ها ناهمگام صدا زده می شوند, به عنوان مثال متد sendBroadcast() بلافاصله برمی گردد و منتظر اجرا شدن receiver ها نمی ماند .
رخدادهای محلی broadcast با LocalBroadcastManager
کلاس LocalBroadcastManager به منظور ثبت و ارسال broadcastهای intent به اشیإ محلی داخل پروسه مورد استفاده قرار می گیرند . این کار از آنجایی که رخدادها برنامه را ترک نمی کنند, امن تر و همچنین سریعتر تلقی می گردد .
مثال:
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 | Override public void onResume() { super .onResume(); // Register mMessageReceiver to receive messages. LocalBroadcastManager.getInstance( this ).registerReceiver(mMessageReceiver, new IntentFilter( "my-event" )); } // handler for received Intents for the "my-event" event private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // Extract data included in the Intent String message = intent.getStringExtra( "message" ); Log.d( "receiver" , "Got message: " + message); } }; @Override protected void onPause() { // Unregister since the activity is not visible LocalBroadcastManager.getInstance( this ).unregisterReceiver(mMessageReceiver); super .onPause(); } // This method is assigned to button in the layout // via the onClick property public void onClick(View view) { sendMessage(); } // Send an Intent with an action named "my-event". private void sendMessage() { Intent intent = new Intent( "my-event" ); // add data intent.putExtra( "message" , "data" ); LocalBroadcastManager.getInstance( this ).sendBroadcast(intent); } <button></button> |
ثبت پویای broadcast receiver
ثبت receiver به صورت پویا
Receiver را می توان از طریق فایل مانیفست اندروید رجیستر کرد. همچنین می توان receiver را در زمان اجرا (runtime) با فراخوانی توابع Context.registerReceiver() و Context.unregisterReceiver() رجیستر یا unregister کرد.
توجه : توجه داشته باشید که باید receiver ای که به صورت پویا ثبت کرده اید را با استفاده از متد Context.unregisterReceiver(), unregister (لغو ثبت) کنید . در صورت فراموش این امر, سیستم اندروید بروز خطای leaked broadcast receiver اعلام می کند . به طور مثال چنانچه در متدهای onResume() اکتیویتی خود receiver ثبت کرده باشید, باید آن را در تابع onPause() لغو ثبت کنید .
استفاده از کلاس package manager برای غیرفعال کردن receiver های ایستا
می توانید با استفاده از کلاس PackageManager, receiverهای رجیستر شده را در فایل AndroidManifest.xml فعال یا غیرفعال کنید.
1 2 3 4 5 6 | ComponentName receiver = new ComponentName(context, myReceiver. class ); PackageManager pm = context.getPackageManager(); pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); <button></button> |
Sticky (broadcast) intents
Intent ای که receiver را فعال سازی کند پس از ارسال و پردازش آن توسط سیستم دیگر در دسترس نخواهد بود. حال اگر از متد sendStickyBroadcast(Intent) استفاده کنید, intent مربوطه sticky خواهد بود . این بدین معنا است که intent ای که شما ارسال می کنید حتی پس از اینکه فرایند پخش (broadcast) تمام می شود, باقی می ماند .
سیستم اندروید از intent نام برده ویژه ی اطلاعات سیستم خاص کمک می گیرد . برای مثال, وضعیت باتری به عنوان sticky intent فرستاده می شود و هر زمانی قابلیت دریافت و پذیرفته شدن آن وجود دارد .
مثال:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // Register for the battery changed event IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); / Intent is sticky so using null as receiver works fine // return value contains the status Intent batteryStatus = this .registerReceiver( null , filter); // Are we charging / charged? int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, - 1 ); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; boolean isFull = status == BatteryManager.BATTERY_STATUS_FULL; // How are we charging? int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, - 1 ); boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; <button></button> |
می توانید داده ی مورد نظر را از طریق مقدار بازگشتی registerReceiver(BroadcastReceiver, IntentFilter) بازیابی کنید . این روش همچنین برای یک BroadcastReceiver تهی (null) نیز کارگر واقع می شود.
در هر شرایط دیگری, درست مشابه (sendBroadcast(Intent عمل می کند .
Sticky broadcast intent (intent هایی که برای راه اندازی broadcast های ماندگار (چسبنده) فرستاده می شوند) عموماً به مجوزهای خاص نیاز دارند.