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 — 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.
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 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 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.
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 Broadcast | Ordine | abortBroadcast | Performanță |
|---|---|---|---|
| Normal | Nu este garantată | Nu funcționează | Ridicată (paralelă) |
| Ordered | După prioritate | Funcționează | Medie (secvențială) |
| Sticky | O singură valoare | Nu 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.
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ă 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ă.
<!-- 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ă 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.
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.
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.
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.
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.
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.
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ă.
// 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
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.
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.
Î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ă.
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.
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
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.
Citiți și