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, време и неколико других. За позадинске задатке уместо Broadcast-а користите WorkManager.
Користите LiveData, StateFlow, EventBus или LocalBroadcastManager за пренос података из onReceive у UI. Не покушавајте да ажурирате UI директно из onReceive — извршава се у главној нити, али пријемник не гарантује да је Activity видљив. LocalBroadcastManager је застарела опција за интерну комуникацију.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође