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 без промени. Ако имате нужда приемниците да си влияят взаимно, използвайте sendOrderedBroadcast вместо sendBroadcast.

Ограничения в Android 8 и по-нови

Android 8 (API 26, Oreo) въведе значителни ограничения за фонови Broadcast. Повечето имплицитни (implicit) Broadcast — тези, които не са адресирани до конкретно приложение — вече не работят със статична регистрация. Системата блокира приемници, регистрирани в манифеста, за действия като 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. Във фрагменти регистрирайте приемника в onStart и отменяйте в onStop, следвайки жизнения цикъл на фрагмента.

Често задавани въпроси

Какво е 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, време и няколко други. За фонови задачи използвайте WorkManager вместо Broadcast.

Как да прехвърля данни от 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 — всеки съдържа допълнителни данни в Intent Extras.
  • Времето за изпълнение на onReceive е ограничено до 10 секунди — за дълготрайни задачи стартирайте WorkManager или JobScheduler от приемника.
  • Алтернативи за Broadcast Receiver в Android 8+: WorkManager за фонови задачи, JobScheduler за периодични задачи, NotificationListenerService за наблюдение на известия.

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също