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 без промени. Ако имате нужда приемниците да си влияят взаимно, използвайте sendOrderedBroadcast вместо sendBroadcast.
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, 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. Във фрагменти регистрирайте приемника в onStart и отменяйте в onStop, следвайки жизнения цикъл на фрагмента.
Често задавани въпроси
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, време и няколко други. За фонови задачи използвайте WorkManager вместо Broadcast.
Използвайте LiveData, StateFlow, EventBus или LocalBroadcastManager за прехвърляне на данни от onReceive към UI. Не се опитвайте да актуализирате UI директно от onReceive — той се изпълнява в основната нишка, но приемникът не гарантира, че Activity е видимо. LocalBroadcastManager е остаряла опция за вътрешна комуникация.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също