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, време и неколико других. За позадинске задатке уместо 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 креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође