Broadcast Receiver je komponenta Androidu, která naslouchá a zpracovává systémové Broadcast zprávy, jako je změna stavu sítě, úroveň nabití baterie, příjem SMS nebo instalace aplikace. Je spouštěn operačním systémem při výskytu události a provádí úlohu v hlavním vlákně nebo prostřednictvím služby na pozadí. Podle Android Developer Guide, 2026 umožňuje Broadcast Receiver aplikaci reagovat na globální systémové události, i když není spuštěna, což z něj činí klíčový mechanismus pro zpracování událostí na pozadí v ekosystému Android.
Hlavní body
Broadcast Receiver je komponenta Androidu určená k příjmu a zpracování Intent zpráv, které jsou šířeny operačním systémem nebo jinými aplikacemi. Na rozdíl od Activity a Service nemá Broadcast Receiver uživatelské rozhraní — jeho úkolem je provést krátký úkol při výskytu události.
Broadcast Receiver funguje prostřednictvím mechanismu Intent. Systém nebo aplikace odešle Intent pomocí sendBroadcast nebo sendOrderedBroadcast a operační systém jej doručí registrovaným přijímačům. Každý přijímač obdrží Intent v metodě onReceive, která se provádí v hlavním vlákně.
Podle Android Compatibility Definition Document musí Broadcast Receiver dokončit onReceive do 10 sekund — jinak jej systém považuje za zablokovaný a ukončí proces. Pro dlouhodobé úlohy na pozadí používejte JobScheduler nebo WorkManager spuštěné z přijímače.
Android podporuje dva hlavní typy Broadcastů: Normal Broadcast a Ordered Broadcast. Rozdíl spočívá v pořadí doručení a možnosti přerušení řetězce zpracování. Kromě toho se Broadcasty dělí na systémové (generované OS) a uživatelské (vytvořené aplikací).
Normal Broadcast je doručen všem registrovaným přijímačům asynchronně a bez zaručeného pořadí. Systém může takové Broadcasty zpracovávat paralelně — každý přijímač obdrží Intent ve vlastním vlákně. Volání abortBroadcast v Normal Broadcastu nemá účinek: doručení ostatním přijímačům nelze zrušit.
Ordered Broadcast je doručen sekvenčně — každému přijímači v sestupném pořadí atributu android:priority (od 0 do 999). Po zpracování může přijímač předat výsledek dalšímu pomocí setResultExtras nebo přerušit řetězec voláním abortBroadcast. To se používá ve scénářích, kde je pořadí zpracování důležité — například přijímače SMS.
Android generuje mnoho systémových Broadcastů: ACTION_BOOT_COMPLETED (spuštění zařízení), ACTION_BATTERY_LOW, ACTION_POWER_CONNECTED, CONNECTIVITY_ACTION, ACTION_PACKAGE_ADDED a další. Každý Intent obsahuje další data v Extras — úroveň baterie, typ připojení, název balíčku.
| Typ Broadcastu | Pořadí | abortBroadcast | Výkon |
|---|---|---|---|
| Normal | Není zaručeno | Ne funguje | Vysoký (paralelní) |
| Ordered | Podle priority | Funguje | Střední (sekvenční) |
| Sticky | Jedna hodnota | Nelze použít | Nízký (zastaralé od API 21) |
Sticky Broadcast — zastaralý typ, který uchovával poslední odeslanou hodnotu. Místo něj používejte LiveData, StateFlow nebo sdílené SharedPreferences pro ukládání posledního stavu.
Broadcast Receiver lze zaregistrovat dvěma způsoby: staticky přes AndroidManifest.xml nebo dynamicky v kódu přes registerReceiver. Volba závisí na scénáři: statická registrace funguje i když aplikace není spuštěna, dynamická — pouze dokud je registrující komponenta aktivní.
Statická registrace je deklarována v manifestu tagem <receiver> uvnitř <application>. Pro každý přijímač je specifikována třída zpracování a Intent filtr s akcemi, které má zachytávat. Systém načítá takové přijímače při výskytu Broadcastu, i když aplikace není spuštěna.
<!-- 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>
Dynamická registrace se provádí metodou registerReceiver v kódu Activity, Service nebo Fragmentu. Přijímač žije pouze tak dlouho, jak žije komponenta, která jej zaregistrovala. Je nutné volat unregisterReceiver v onPause nebo onDestroy — jinak dojde k úniku paměti a systém může ukončit proces.
Pro Ordered Broadcast je pořadí doručení určeno atributem android:priority. Přijímač s vyšší prioritou obdrží Intent dříve. Pokud po zpracování zavolá abortBroadcast, přijímače s nižší prioritou Intent neobdrží. Pro statické přijímače je priorita nastavena v Intent filtru manifestu.
Přijímače v Ordered Broadcastu mohou předávat data dalšímu v řetězci prostřednictvím setResultExtras nebo setResultData. To umožňuje organizovat zpracování v řetězci: první přijímač obohatí Intent o další data, druhý je použije, třetí dokončí řetězec. Metoda getResultExtras čte data předaná předchozím přijímačem.
Pro Normal Broadcast není pořadí zaručeno, takže všichni přijímače obdrží původní Intent beze změn. Pokud potřebujete, aby se přijímače vzájemně ovlivňovaly, použijte sendOrderedBroadcast místo sendBroadcast.
Android 8 (API 26, Oreo) zavedl významná omezení pro Broadcasty na pozadí. Většina implicitních Broadcastů — těch, které nejsou adresovány konkrétní aplikaci — již nefunguje se statickou registrací. Systém blokuje přijímače registrované v manifestu pro akce jako CONNECTIVITY_ACTION nebo ACTION_BATTERY_LOW.
Google stanovil seznam Broadcastů, které nadále fungují se statickou registrací: BOOT_COMPLETED, TIME_TICK, Alarm, INSTANCE? (změny balíčků) — celkem asi deset výjimek. Všechny ostatní implicitní Broadcasty nyní vyžadují dynamickou registraci prostřednictvím Context.registerReceiver, která funguje pouze když je aplikace v popředí.
Pro úlohy na pozadí, které byly dříve řešeny pomocí Broadcast Receiveru, Android doporučuje WorkManager (odložené úlohy se zárukou provedení), JobScheduler (periodické úlohy s ohledem na stav zařízení) a NotificationListenerService (monitorování oznámení). Tyto komponenty fungují bez omezení Android 8 a jsou optimalizovány pro spotřebu energie.
Uvažujme vytvoření Broadcast Receiveru pro sledování připojení k síti. Přijímač bude přijímat Broadcast CONNECTIVITY_ACTION a logovat typ připojení. Pro Android 8+ jej zaregistrujeme dynamicky, protože se jedná o implicitní Broadcast vyloučený ze statické registrace.
// Broadcast Receiver pro sledování stavu sítě
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", "Typ připojení: $connectionType")
}
}
// Dynamická registrace v 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)
}
}
Nezapomeňte zrušit registraci přijímače v onStop — pokud Activity přejde na pozadí, ale přijímač zůstane registrován, systém nebude moci uvolnit prostředky. Pro Service použijte onDestroy. Ve fragmentech registrujte přijímač v onStart a rušte v onStop, podle životního cyklu fragmentu.
Často kladené otázky
Broadcast Receiver je komponenta Androidu pro zpracování systémových a uživatelských Broadcast zpráv. Přijímá Intent v metodě onReceive, která se provádí v hlavním vlákně a musí být dokončena do 10 sekund. Pro dlouhodobé úlohy používejte WorkManager nebo JobScheduler.
Normal Broadcast je doručen všem přijímačům asynchronně a paralelně — pořadí není zaručeno, abortBroadcast nefunguje. Ordered Broadcast je předáván sekvenčně podle priority, každý přijímač může přerušit řetězec nebo předat data pomocí setResultExtras.
Statická registrace (v manifestu) umožňuje přijímači fungovat i když aplikace není spuštěna. Dynamická (přes registerReceiver) funguje pouze dokud je registrující komponenta aktivní. Od Androidu 8 mnoho implicitních Broadcastů vyžaduje dynamickou registraci.
Android 8 (API 26) zakázal statickou registraci pro většinu implicitních Broadcastů, jako CONNECTIVITY_ACTION nebo ACTION_BATTERY_LOW. Výjimky zahrnují BOOT_COMPLETED, Alarm, čas a několik dalších. Pro úlohy na pozadí používejte WorkManager místo Broadcastu.
Použijte LiveData, StateFlow, EventBus nebo LocalBroadcastManager k předání dat z onReceive do UI. Nepokoušejte se aktualizovat UI přímo z onReceive — provádí se v hlavním vlákně, ale přijímač nezaručuje, že je Activity viditelné. LocalBroadcastManager je zastaralá možnost pro interní komunikaci.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také