Broadcast Receiver: ce este, tipuri de Broadcast și principiul de funcționare

Autor: IT Sectr Publicat: 2026-06-17 Timp de citire: 7 min

Broadcast Receiver — o componentă Android care ascultă și procesează mesajele sistemice Broadcast, cum ar fi schimbarea stării rețelei, nivelul de încărcare a bateriei, primirea SMS sau instalarea aplicației. Este pornit de sistemul de operare la apariția evenimentului și execută sarcina în thread-ul principal sau printr-un serviciu de fundal. Conform Android Developer Guide, 2026, Broadcast Receiver permite aplicației să reacționeze la evenimente globale de sistem, chiar dacă nu este pornită, ceea ce îl face un mecanism cheie pentru procesarea evenimentelor în fundal în ecosistemul Android.

Principalele puncte

  • Broadcast Receiver — componentă Android pentru procesarea asincronă a mesajelor Broadcast sistemice și utilizator.
  • Ordered Broadcast este transmis secvențial în funcție de prioritate și poate fi întrerupt de orice receptor.
  • Normal Broadcast este livrat tuturor abonaților simultan — ordinea de procesare nu este garantată.
  • Înregistrarea poate fi statică (în manifest) sau dinamică (în cod prin registerReceiver).
  • Restricții Android 8+ interzic înregistrarea statică pentru multe Broadcast implicite, reducând sarcina de fundal.

Ce este Broadcast Receiver?

Broadcast Receiver — este o componentă Android destinată primirii și procesării mesajelor Intent care sunt difuzate de sistemul de operare sau de alte aplicații. Spre deosebire de Activity și Service, Broadcast Receiver nu are interfață de utilizator — sarcina sa este să execute o sarcină scurtă la apariția evenimentului.

Broadcast Receiver funcționează prin mecanismul Intent. Sistemul sau aplicația trimite Intent prin sendBroadcast sau sendOrderedBroadcast, iar sistemul de operare îl livrează receptorilor înregistrați. Fiecare receptor primește Intent în metoda onReceive, care este executată în thread-ul principal.

Conform Android Compatibility Definition Document, Broadcast Receiver trebuie să finalizeze onReceive în 10 secunde — în caz contrar sistemul îl consideră blocat și termină procesul. Pentru sarcini de lungă durată în fundal, utilizați JobScheduler sau WorkManager, pornite din receptor.

Tipuri de Broadcast în Android

Android suportă două tipuri principale de Broadcast: Normal Broadcast și Ordered Broadcast. Diferența constă în ordinea de livrare și posibilitatea de a întrerupe lanțul de procesare. În plus, Broadcast-urile se împart în sistemice (generate de OS) și utilizator (create de aplicație).

Normal Broadcast

Normal Broadcast este livrat tuturor receptorilor înregistrați asincron și fără o ordine garantată. Sistemul poate procesa astfel de Broadcast-uri în paralel — fiecare receptor primește Intent în propriul thread. Apelarea abortBroadcast în Normal Broadcast nu are efect: livrarea către alți receptori nu poate fi anulată.

Ordered Broadcast

Ordered Broadcast este livrat secvențial — fiecărui receptor în ordinea descrescătoare a atributului android:priority (de la 0 la 999). După procesare, receptorul poate transmite rezultatul următorului prin setResultExtras sau poate întrerupe lanțul apelând abortBroadcast. Aceasta este utilizată în scenarii unde ordinea de procesare este importantă — de exemplu, receptoarele SMS.

Broadcast-uri sistemice

Android generează numeroase Broadcast-uri sistemice: ACTION_BOOT_COMPLETED (pornirea dispozitivului), ACTION_BATTERY_LOW, ACTION_POWER_CONNECTED, CONNECTIVITY_ACTION, ACTION_PACKAGE_ADDED și altele. Fiecare Intent conține date suplimentare în Extras — nivelul bateriei, tipul conexiunii, numele pachetului.

Tip BroadcastOrdineabortBroadcastPerformanță
NormalNu este garantatăNu funcționeazăRidicată (paralelă)
OrderedDupă prioritateFuncționeazăMedie (secvențială)
StickyO singură valoareNu se aplicăScăzută (îndepărtat de la API 21)

Sticky Broadcast — un tip învechit care păstra ultima valoare trimisă. În locul acestuia, utilizați LiveData, StateFlow sau SharedPreferences partajate pentru stocarea ultimei stări.

Înregistrarea Broadcast Receiver

Broadcast Receiver poate fi înregistrat în două moduri: static prin AndroidManifest.xml sau dinamic în cod prin registerReceiver. Alegerea depinde de scenariu: înregistrarea statică funcționează chiar dacă aplicația nu este pornită, cea dinamică — doar cât timp componenta înregistratoare este activă.

Înregistrarea statică

Înregistrarea statică este declarată în manifest cu tagul <receiver> în interiorul <application>. Pentru fiecare receptor se specifică clasa de procesare și filtrul Intent cu acțiunile pe care trebuie să le intercepteze. Sistemul încarcă astfel de receptori la apariția Broadcast-ului chiar dacă aplicația nu este pornită.

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>

Înregistrarea dinamică

Înregistrarea dinamică este realizată prin metoda registerReceiver în codul Activity, Service sau Fragment. Receptorul trăiește doar cât trăiește componenta care l-a înregistrat. Este obligatoriu să apelați unregisterReceiver în onPause sau onDestroy — altfel va apărea o scurgere de memorie, iar sistemul poate termina procesul.

Prioritate și ordinea de procesare

Pentru Ordered Broadcast, ordinea de livrare este determinată de atributul android:priority. Receptorul cu prioritate mai mare primește Intent mai devreme. Dacă după procesare apelează abortBroadcast, receptorii cu prioritate mai mică nu vor primi Intent. Pentru receptorii statici, prioritatea este setată în filtrul Intent din manifest.

Transmiterea datelor între receptori

Receptorii în Ordered Broadcast pot transmite date următorului în lanț prin setResultExtras sau setResultData. Acest lucru permite organizarea procesării în conductă: primul receptor îmbogățește Intent cu date suplimentare, al doilea le utilizează, al treilea finalizează lanțul. Metoda getResultExtras citește datele transmise de receptorul anterior.

Pentru Normal Broadcast, ordinea nu este garantată, astfel că toți receptorii primesc Intent-ul original fără modificări. Dacă aveți nevoie ca receptorii să se influențeze reciproc, utilizați sendOrderedBroadcast în loc de sendBroadcast.

Restricții în Android 8 și mai nou

Android 8 (API 26, Oreo) a introdus restricții semnificative privind Broadcast-urile de fundal. Majoritatea Broadcast-urilor implicite (implicit) — cele care nu sunt adresate unei aplicații specifice — nu mai funcționează cu înregistrarea statică. Sistemul blochează receptorii înregistrați în manifest pentru acțiuni precum CONNECTIVITY_ACTION sau ACTION_BATTERY_LOW.

Ce s-a schimbat

Google a stabilit o listă de Broadcast-uri care continuă să funcționeze cu înregistrarea statică: BOOT_COMPLETED, TIME_TICK, Alarm, INSTANCE? (modificări de pachet) — în total aproximativ zece excepții. Toate celelalte Broadcast-uri implicite necesită acum înregistrare dinamică prin Context.registerReceiver, care funcționează doar când aplicația este în prim-plan.

Alternative la Broadcast Receiver

Pentru sarcinile de fundal care anterior erau rezolvate prin Broadcast Receiver, Android recomandă WorkManager (sarcini amânate cu garanție de execuție), JobScheduler (sarcini periodice ținând cont de starea dispozitivului) și NotificationListenerService (monitorizarea notificărilor). Aceste componente funcționează fără restricțiile Android 8 și sunt optimizate pentru consumul de energie.

Exemplu Broadcast Receiver în Kotlin

Să considerăm crearea unui Broadcast Receiver pentru urmărirea conexiunii la rețea. Receptorul va primi Broadcast CONNECTIVITY_ACTION și va înregistra tipul conexiunii. Pentru Android 8+, îl vom înregistra dinamic, deoarece este un Broadcast implicit exclus din înregistrarea statică.

kotlin
// Broadcast Receiver pentru urmărirea stării rețelei
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", "Tip conexiune: $connectionType")
    }
}

// Înregistrare dinamică în 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)
    }
}

Anulați obligatoriu înregistrarea receptorului în onStop — dacă Activity trece în fundal, dar receptorul rămâne înregistrat, sistemul nu va putea elibera resursele. Pentru Service, utilizați onDestroy. În fragmente, înregistrați receptorul în onStart și anulați în onStop, urmând ciclul de viață al fragmentului.

Întrebări frecvente

Ce este Broadcast Receiver în Android?

Broadcast Receiver — este o componentă Android pentru procesarea mesajelor Broadcast sistemice și utilizator. Primește Intent în metoda onReceive, care este executată în thread-ul principal și trebuie să se finalizeze în 10 secunde. Pentru sarcini de lungă durată, utilizați WorkManager sau JobScheduler.

Care este diferența dintre Normal Broadcast și Ordered Broadcast?

Normal Broadcast este livrat tuturor receptorilor asincron și în paralel — ordinea nu este garantată, abortBroadcast nu funcționează. Ordered Broadcast este transmis secvențial în funcție de prioritate, fiecare receptor putând întrerupe lanțul sau transmite date următorului prin setResultExtras.

Care este diferența dintre înregistrarea statică și cea dinamică?

Înregistrarea statică (în manifest) permite receptorului să funcționeze chiar dacă aplicația nu este pornită. Înregistrarea dinamică (prin registerReceiver) funcționează doar cât timp componenta înregistratoare este activă. începând cu Android 8, multe Broadcast-uri implicite necesită înregistrare dinamică.

Ce restricții au apărut în Android 8 pentru Broadcast Receiver?

Android 8 (API 26) a interzis înregistrarea statică pentru majoritatea Broadcast-urilor implicite, cum ar fi CONNECTIVITY_ACTION sau ACTION_BATTERY_LOW. Excepțiile includ BOOT_COMPLETED, Alarm, timpul și câteva altele. Pentru sarcinile de fundal, în loc de Broadcast, utilizați WorkManager.

Cum să transmit date de la Broadcast Receiver la Activity?

Utilizați LiveData, StateFlow, EventBus sau LocalBroadcastManager pentru a transmite date de la onReceive la UI. Nu încercați să actualizați UI direct din onReceive — este executat în thread-ul principal, dar receptorul nu garantează că Activity este vizibilă. LocalBroadcastManager este o opțiune învechită pentru comunicarea internă.

Rezumat

  • Broadcast Receiver — componentă de sistem Android pentru primirea și procesarea evenimentelor globale prin mesaje Intent de la OS sau alte aplicații.
  • Normal Broadcast este livrat în paralel fără garanția ordinii; Ordered Broadcast este transmis secvențial în funcție de prioritate cu posibilitatea de întrerupere a lanțului.
  • Înregistrarea statică în manifest funcționează pentru procese care nu sunt încă pornite, dar este limitată în Android 8+ pentru majoritatea Broadcast-urilor implicite.
  • Înregistrarea dinamică prin registerReceiver necesită apelarea obligatorie a unregisterReceiver pentru prevenirea scurgerilor de memorie.
  • Broadcast-urile sistemice includ BOOT_COMPLETED, CONNECTIVITY_ACTION, BATTERY_LOW — fiecare conține date suplimentare în Extras Intent.
  • Timpul de execuție al onReceive este limitat la 10 secunde — pentru sarcini de lungă durată, porniți WorkManager sau JobScheduler din receptor.
  • Alternative pentru Broadcast Receiver în Android 8+: WorkManager pentru sarcini de fundal, JobScheduler pentru sarcini periodice, NotificationListenerService pentru monitorizarea notificărilor.

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și