Broadcast Receiver: چیست، انواع Broadcast و اصل کار

نویسنده: IT Sectr منتشر شده: 2026-06-17 زمان مطالعه: 7 دقیقه

Broadcast Receiver — یک قطعه Android است که پیام‌های Broadcast سیستم را گوش می‌دهد و پردازش می‌کند، مانند تغییر وضعیت شبکه، سطح باتری، دریافت SMS یا نصب برنامه. آن توسط سیستم‌عامل در زمان روی دادن رویداد اجرا می‌شود و وظیفه‌ای را در ریسه‌موظف یا از طریق یک سرویس پس‌زمینه انجام می‌دهد. بر اساس Android Developer Guide, 2026، Broadcast Receiver به برنامه اجازه می‌دهد به رویدادهای جهانی سیستم واکنش نشان دهد، حتی اگر اجرا نشده باشد، که آن را به یک مکانیسم کلیدی برای پردازش رویدادهای پس‌زمینه در اکوسیستم Android تبدیل می‌کند.

نکات کلیدی

  • Broadcast Receiver — قطعه‌ای Android برای پردازش اسینکرون پیام‌های Broadcast سیستم و کاربری.
  • Ordered Broadcast به ترتیب بر اساس اولویت ارسال می‌شود و می‌تواند توسط هر گیرنده‌ای متوقف شود.
  • Normal Broadcast به همه مشترکان به‌طور همزمان ارسال می‌شود — ترتیب پردازش تضمین نمی‌شود.
  • ثبت می‌تواند استاتیک (در مانیفست) یا دینامیک (در کد از طریق registerReceiver) باشد.
  • محدودیت‌ها Android 8+ ثبت استاتیک را برای بسیاری از Broadcast‌های ضمنی ممنوع می‌کند که بار پس‌زمینه را کاهش می‌دهد.

Broadcast Receiver چیست؟

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 استفاده کنید که از گیرنده اجرا شده‌اند.

انواع Broadcast در Android

Android از دو نوع اصلی Broadcast پشتیبانی می‌کند: Normal Broadcast و Ordered Broadcast. تفاوت در ترتیب تحویل و امکان قطع زنجیره پردازش است. علاوه بر این، Broadcast‌ها به سیستمی (تولید شده توسط OS) و کاربری (ایجاد شده توسط برنامه) تقسیم می‌شوند.

Normal Broadcast

Normal Broadcast به تمام گیرندگان ثبت‌شده به صورت اسینکرون و بدون ترتیب تضمینی تحویل داده می‌شود. سیستم می‌تواند چنین Broadcast‌هایی را به صورت موازی پردازش کند — هر گیرنده Intent را در ریسه خود دریافت می‌کند. فراخوانی abortBroadcast در Normal Broadcast تاثیری ندارد: نمی‌توان تحویل به سایر گیرندگان را لغو کرد.

Ordered Broadcast

Ordered Broadcast به ترتیب تحویل داده می‌شود — به هر گیرنده به ترتیب کاهش ویژگی android:priority (از 0 تا 999). پس از پردازش، گیرنده می‌تواند نتیجه را از طریق setResultExtras به بعدی ارسال کند یا با فراخوانی abortBroadcast زنجیره را قطع کند. این در سناریوهایی که ترتیب پردازش مهم است استفاده می‌شود — مانند گیرندگان SMS.

Broadcast‌های سیستمی

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

Broadcast Receiver را می‌توان به دو روش ثبت کرد: استاتیک از طریق AndroidManifest.xml یا دینامیک در کد از طریق registerReceiver. انتخاب به سناریو بستگی دارد: ثبت استاتیک حتی اگر برنامه اجرا نشده باشد نیز کار می‌کند، دینامیک — تنها زمانی که قطعه ثبت‌کننده فعال است.

ثبت استاتیک

ثبت استاتیک در مانیفست با تگ <receiver> داخل <application> اعلام می‌شود. برای هر گیرنده کلاس پردازشگر و فیلتر Intent با اقضامی که باید گیرنده شود مشخص می‌شود. سیستم چنین گیرندگانی را در زمان روی دادن Broadcast حتی اگر برنامه اجرا نشده باشد بارگیری می‌کند.

xml
<!-- 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 و جدیدتر

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

برای وظایف پس‌زمینه که قبلاً از طریق Broadcast Receiver انجام می‌شد، Android WorkManager (وظایف تأخیری با تضمین اجرا)، JobScheduler (وظایف دوره‌ای با توجه به وضعیت دستگاه) و NotificationListenerService (نظارت بر اعلام‌ها) را توصیه می‌کند. این قطعات بدون محدودیت‌های Android 8 کار می‌کنند و برای مصرف انرژی بهینه‌سازی شده‌اند.

مثال Broadcast Receiver در Kotlin

ایجاد Broadcast Receiver برای ردیابی اتصال شبکه را در نظر بگیرید. گیرنده Broadcast CONNECTIVITY_ACTION را دریافت کرده و نوع اتصال را ثبت می‌کند. برای Android 8+ آن را دینامیک ثبت می‌کنیم، زیرا این یک Broadcast ضمنی است که از ثبت استاتیک مستثنا شده است.

kotlin
// 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 Receiver — قطعه‌ای Android برای پردازش پیام‌های Broadcast سیستم و کاربری. آن Intent را در روش onReceive دریافت می‌کند که در ریسه‌موظف اجرا شده و باید طی 10 ثانیه تکمیل شود. برای وظایف طولانی از WorkManager یا JobScheduler استفاده کنید.

تفاوت Normal Broadcast و Ordered Broadcast چیست؟

Normal Broadcast به تمام گیرندگان به صورت اسینکرون و موازی ارسال می‌شود — ترتیب تضمین نمی‌شود، abortBroadcast کار نمی‌کند. Ordered Broadcast به ترتیب بر اساس اولویت ارسال می‌شود، هر گیرنده می‌تواند زنجیره را قطع کرده یا از طریق setResultExtras داده ارسال کند.

تفاوت ثبت استاتیک و دینامیک چیست؟

ثبت استاتیک (در مانیفست) به گیرنده اجازه می‌دهد حتی اگر برنامه اجرا نشده باشد کار کند. ثبت دینامیک (از طریق registerReceiver) تنها زمانی کار می‌کند که قطعه ثبت‌کننده فعال است. از Android 8، بسیاری از Broadcast‌های ضمنی نیازمند ثبت دینامیک هستند.

چه محدودیت‌هایی در Android 8 برای Broadcast Receiver ایجاد شد؟

Android 8 (API 26) ثبت استاتیک را برای اکثر Broadcast‌های ضمنی مانند CONNECTIVITY_ACTION یا ACTION_BATTERY_LOW ممنوع کرد. استثناها شامل BOOT_COMPLETED، Alarm، زمان و چند مورد دیگر است. برای وظایف پس‌زمینه به جای Broadcast از WorkManager استفاده کنید.

چگونه داده‌ها را از Broadcast Receiver به Activity انتقال دهیم؟

از LiveData، StateFlow، EventBus یا LocalBroadcastManager برای انتقال داده‌ها از onReceive به UI استفاده کنید. سعی نکنید UI را مستقیماً از onReceive به‌روز کنید — آن در ریسه‌موظف اجرا می‌شود، اما گیرنده نمی‌تواند قصور کند که Activity قابل مشاهده است. LocalBroadcastManager یک گزینه منسوخ برای ارتباط داخلی است.

خلاصه

  • Broadcast Receiver — قطعه سیستمی Android برای دریافت و پردازش رویدادهای جهانی از طریق پیام‌های Intent از OS یا سایر برنامه‌ها.
  • Normal Broadcast بدون تضمین ترتیب به صورت موازی ارسال می‌شود؛ Ordered Broadcast به ترتیب بر اساس اولویت با امکان قطع زنجیره ارسال می‌شود.
  • ثبت استاتیک در مانیفست برای فرآیندهایی که هنوز اجرا نشده‌اند کار می‌کند، اما در Android 8+ برای اکثر Broadcast‌های ضمنی محدود شده است.
  • ثبت دینامیک از طریق registerReceiver نیازمند فراخوانی اجباری unregisterReceiver برای جلوگیری از نشت حافظه است.
  • Broadcast‌های سیستم شامل BOOT_COMPLETED، CONNECTIVITY_ACTION، BATTERY_LOW هستند — هر یک حاوی داده‌های اضافی در Extras Intent است.
  • زمان اجرای onReceive به 10 ثانیه محدود است — برای وظایف طولانی WorkManager یا JobScheduler را از گیرنده اجرا کنید.
  • جایگزین‌ها برای Broadcast Receiver در Android 8+: WorkManager برای وظایف پس‌زمینه، JobScheduler برای وظایف دوره‌ای، NotificationListenerService برای نظارت بر اعلام‌ها.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید