Broadcast Receiver — یک قطعه Android است که پیامهای Broadcast سیستم را گوش میدهد و پردازش میکند، مانند تغییر وضعیت شبکه، سطح باتری، دریافت SMS یا نصب برنامه. آن توسط سیستمعامل در زمان روی دادن رویداد اجرا میشود و وظیفهای را در ریسهموظف یا از طریق یک سرویس پسزمینه انجام میدهد. بر اساس Android Developer Guide, 2026، Broadcast Receiver به برنامه اجازه میدهد به رویدادهای جهانی سیستم واکنش نشان دهد، حتی اگر اجرا نشده باشد، که آن را به یک مکانیسم کلیدی برای پردازش رویدادهای پسزمینه در اکوسیستم Android تبدیل میکند.
نکات کلیدی
Broadcast Receiver — قطعهای Android است که برای دریافت و پردازش پیامهای Intent طراحی شده است که توسط سیستمعامل یا سایر برنامهها منتشر میشوند. بر خلاف Activity و Service، Broadcast Receiver رابط کاربری ندارد — وظیفهاش انجام یک وظیفه کوتاه در زمان روی دادن رویداد است.
Broadcast Receiver از طریق مکانیسم Intent کار میکند. سیستم یا برنامه Intent را از طریق sendBroadcast یا sendOrderedBroadcast ارسال میکند، و سیستمعامل آن را به گیرندگان ثبتشده تحویل میدهد. هر گیرنده Intent را در روش onReceive دریافت میکند که در ریسهموظف اجرا میشود.
بر اساس Android Compatibility Definition Document، Broadcast Receiver باید onReceive را طی 10 ثانیه تکمیل کند — در غیر این صورت سیستم آن را منجمد در نظر میگیرد و فرآیند را پایان میدهد. برای وظایف طولانی پسزمینه از JobScheduler یا WorkManager استفاده کنید که از گیرنده اجرا شدهاند.
Android از دو نوع اصلی Broadcast پشتیبانی میکند: Normal Broadcast و Ordered Broadcast. تفاوت در ترتیب تحویل و امکان قطع زنجیره پردازش است. علاوه بر این، Broadcastها به سیستمی (تولید شده توسط OS) و کاربری (ایجاد شده توسط برنامه) تقسیم میشوند.
Normal Broadcast به تمام گیرندگان ثبتشده به صورت اسینکرون و بدون ترتیب تضمینی تحویل داده میشود. سیستم میتواند چنین Broadcastهایی را به صورت موازی پردازش کند — هر گیرنده Intent را در ریسه خود دریافت میکند. فراخوانی abortBroadcast در Normal Broadcast تاثیری ندارد: نمیتوان تحویل به سایر گیرندگان را لغو کرد.
Ordered Broadcast به ترتیب تحویل داده میشود — به هر گیرنده به ترتیب کاهش ویژگی android:priority (از 0 تا 999). پس از پردازش، گیرنده میتواند نتیجه را از طریق setResultExtras به بعدی ارسال کند یا با فراخوانی abortBroadcast زنجیره را قطع کند. این در سناریوهایی که ترتیب پردازش مهم است استفاده میشود — مانند گیرندگان SMS.
Android تعداد زیادی Broadcast سیستمی تولید میکند: ACTION_BOOT_COMPLETED (بارگذاری دستگاه)، ACTION_BATTERY_LOW، ACTION_POWER_CONNECTED، CONNECTIVITY_ACTION، ACTION_PACKAGE_ADDED و سایر. هر Intent حاوی دادههای اضافی در Extras است — سطح باتری، نوع اتصال، نام پکیج.
| نوع Broadcast | ترتیب | abortBroadcast | عملکرد |
|---|---|---|---|
| Normal | تضمین نمیشود | کار نمیکند | بالا (موازی) |
| Ordered | بر اساس اولویت | کار میکند | متوسط (ترتیبی) |
| Sticky | یک مقدار | قابل اعمال نیست | پایین (منسوخ از API 21) |
Sticky Broadcast — نوع منسوخی که آخرین مقدار ارسالی را ذخیره میکرد. به جای آن از LiveData، StateFlow یا SharedPreferences اشتراکی برای ذخیره آخرین وضعیت استفاده کنید.
Broadcast Receiver را میتوان به دو روش ثبت کرد: استاتیک از طریق AndroidManifest.xml یا دینامیک در کد از طریق registerReceiver. انتخاب به سناریو بستگی دارد: ثبت استاتیک حتی اگر برنامه اجرا نشده باشد نیز کار میکند، دینامیک — تنها زمانی که قطعه ثبتکننده فعال است.
ثبت استاتیک در مانیفست با تگ <receiver> داخل <application> اعلام میشود. برای هر گیرنده کلاس پردازشگر و فیلتر Intent با اقضامی که باید گیرنده شود مشخص میشود. سیستم چنین گیرندگانی را در زمان روی دادن Broadcast حتی اگر برنامه اجرا نشده باشد بارگیری میکند.
<!-- Static Broadcast Receiver registration in manifest -->
<receiver android:name=".BootReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
ثبت دینامیک با روش registerReceiver در کد Activity، Service یا Fragment انجام میشود. گیرنده تنها تا زمانی که قطعه ثبتکننده زنده است عمل میکند. حتماً unregisterReceiver را در onPause یا onDestroy فراخوان کنید — در غیر این صورت نشت حافظه رخ میدهد و سیستم میتواند فرآیند را پایان دهد.
برای Ordered Broadcast ترتیب تحویل توسط ویژگی android:priority تعیین میشود. گیرنده با اولویت بالاتر Intent را زودتر دریافت میکند. اگر پس از پردازش abortBroadcast را فراخوان کند، گیرندگان با اولویت پایینتر Intent را دریافت نمیکنند. برای گیرندگان استاتیک، اولویت در فیلتر Intent مانیفست تعیین میشود.
گیرندگان در Ordered Broadcast میتوانند از طریق setResultExtras یا setResultData دادهها را به بعدی در زنجیره ارسال کنند. این امکان پردازش خط لوله را فراهم میکند: گیرنده اول Intent را با دادههای اضافی غنی میکند، دومی از آنها استفاده میکند، سومی زنجیره را تکمیل میکند. روش getResultExtras دادههای ارسالی توسط گیرنده قبلی را میخواند.
برای Normal Broadcast ترتیب تضمین نمیشود، بنابراین تمام گیرندگان Intent اصلی را بدون تغییر دریافت میکنند. اگر نیاز دارید که گیرندگان بر یکدیگر تاثیر بگذارند، به جای sendBroadcast از sendOrderedBroadcast استفاده کنید.
Android 8 (API 26, Oreo) محدودیتهای قابل توجهی در مورد Broadcastهای پسزمینه اعمال کرد. اکثر Broadcastهای ضمنی (implicit) — آنهایی که خطاب به برنامه مشخصی ندارند — دیگر با ثبت استاتیک کار نمیکنند. سیستم گیرندگان ثبتشده در مانیفست را برای اقضامی مانند CONNECTIVITY_ACTION یا ACTION_BATTERY_LOW بلوک میکند.
Google فهرستی از Broadcastهایی را مشخص کرد که با ثبت استاتیک به کار خود ادامه میدهند: BOOT_COMPLETED، TIME_TICK، Alarm، INSTANCE? (تغییرات پکیج) — در جمل حدود ده استثنا. سایر تمام Broadcastهای ضمنی حالا ثبت دینامیک از طریق Context.registerReceiver را نیاز دارند که تنها زمانی که برنامه در پیشزمینه است کار میکند.
برای وظایف پسزمینه که قبلاً از طریق Broadcast Receiver انجام میشد، Android WorkManager (وظایف تأخیری با تضمین اجرا)، JobScheduler (وظایف دورهای با توجه به وضعیت دستگاه) و NotificationListenerService (نظارت بر اعلامها) را توصیه میکند. این قطعات بدون محدودیتهای Android 8 کار میکنند و برای مصرف انرژی بهینهسازی شدهاند.
ایجاد Broadcast Receiver برای ردیابی اتصال شبکه را در نظر بگیرید. گیرنده Broadcast CONNECTIVITY_ACTION را دریافت کرده و نوع اتصال را ثبت میکند. برای Android 8+ آن را دینامیک ثبت میکنیم، زیرا این یک Broadcast ضمنی است که از ثبت استاتیک مستثنا شده است.
// Broadcast Receiver برای ردیابی وضعیت شبکه
class NetworkReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val network = cm.activeNetwork
val caps = cm.getNetworkCapabilities(network)
val connectionType = when {
caps?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) == true -> "WiFi"
caps?.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == true -> "Cellular"
else -> "Disconnected"
}
Log.d("NetworkReceiver", "نوع اتصال: $connectionType")
}
}
// ثبت پویا در Activity
class MainActivity : AppCompatActivity() {
private val networkReceiver = NetworkReceiver()
override fun onStart() {
super.onStart()
val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
registerReceiver(networkReceiver, filter)
}
override fun onStop() {
super.onStop()
unregisterReceiver(networkReceiver)
}
}
حتماً ثبت گیرنده را در onStop لغو کنید — اگر Activity به پسزمینه برود، اما گیرنده ثبتشده باقی بماند، سیستم نمیتواند منابع را آزاد کند. برای Service از onDestroy استفاده کنید. در Fragmentها، گیرنده را در onStart ثبت کنید و در onStop لغو کنید، به تبع چرخه عمر Fragment.
سوالات متداول
Broadcast Receiver — قطعهای Android برای پردازش پیامهای Broadcast سیستم و کاربری. آن Intent را در روش onReceive دریافت میکند که در ریسهموظف اجرا شده و باید طی 10 ثانیه تکمیل شود. برای وظایف طولانی از WorkManager یا JobScheduler استفاده کنید.
Normal Broadcast به تمام گیرندگان به صورت اسینکرون و موازی ارسال میشود — ترتیب تضمین نمیشود، abortBroadcast کار نمیکند. Ordered Broadcast به ترتیب بر اساس اولویت ارسال میشود، هر گیرنده میتواند زنجیره را قطع کرده یا از طریق setResultExtras داده ارسال کند.
ثبت استاتیک (در مانیفست) به گیرنده اجازه میدهد حتی اگر برنامه اجرا نشده باشد کار کند. ثبت دینامیک (از طریق registerReceiver) تنها زمانی کار میکند که قطعه ثبتکننده فعال است. از Android 8، بسیاری از Broadcastهای ضمنی نیازمند ثبت دینامیک هستند.
Android 8 (API 26) ثبت استاتیک را برای اکثر Broadcastهای ضمنی مانند CONNECTIVITY_ACTION یا ACTION_BATTERY_LOW ممنوع کرد. استثناها شامل BOOT_COMPLETED، Alarm، زمان و چند مورد دیگر است. برای وظایف پسزمینه به جای Broadcast از WorkManager استفاده کنید.
از LiveData، StateFlow، EventBus یا LocalBroadcastManager برای انتقال دادهها از onReceive به UI استفاده کنید. سعی نکنید UI را مستقیماً از onReceive بهروز کنید — آن در ریسهموظف اجرا میشود، اما گیرنده نمیتواند قصور کند که Activity قابل مشاهده است. LocalBroadcastManager یک گزینه منسوخ برای ارتباط داخلی است.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید