Broadcast Receiver: co to je, typy Broadcastů a princip fungování

Autor: IT Sectr Publikováno: 2026-06-17 Doba čtení: 7 min

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 — komponenta Androidu pro asynchronní zpracování systémových a uživatelských Broadcast zpráv.
  • Ordered Broadcast je předáván sekvenčně podle priority a může být přerušen libovolným přijímačem.
  • Normal Broadcast je doručen všem odběratelům současně — pořadí zpracování není zaručeno.
  • Registrace může být statická (v manifestu) a dynamická (v kódu přes registerReceiver).
  • Omezení Android 8+ zakazují statickou registraci pro mnoho implicitních Broadcastů, což snižuje zátěž na pozadí.

Co je Broadcast Receiver?

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.

Typy Broadcastů v Androidu

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

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

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.

Systémové Broadcasty

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 BroadcastuPořadíabortBroadcastVýkon
NormalNení zaručenoNe fungujeVysoký (paralelní)
OrderedPodle priorityFungujeStřední (sekvenční)
StickyJedna hodnotaNelze použítNí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.

Registrace Broadcast Receiveru

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

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.

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>

Dynamická registrace

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.

Priorita a pořadí zpracování

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ředávání dat mezi přijímači

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.

Omezení v Android 8 a novějším

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.

Co se změnilo

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í.

Alternativy k Broadcast Receiveru

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.

Příklad Broadcast Receiveru v Kotlinu

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.

kotlin
// 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

Co je Broadcast Receiver v Androidu?

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.

Jaký je rozdíl mezi Normal Broadcast a Ordered Broadcast?

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.

Jaký je rozdíl mezi statickou a dynamickou registrací?

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.

Jaká omezení se objevila v Android 8 pro Broadcast Receiver?

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.

Jak předat data z Broadcast Receiveru do Activity?

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í

  • Broadcast Receiver — systémová komponenta Androidu pro příjem a zpracování globálních událostí prostřednictvím Intent zpráv od OS nebo jiných aplikací.
  • Normal Broadcast je doručen paralelně bez záruky pořadí; Ordered Broadcast je předáván sekvenčně podle priority s možností přerušení řetězce.
  • Statická registrace v manifestu funguje pro procesy, které ještě nejsou spuštěny, ale je omezena v Android 8+ pro většinu implicitních Broadcastů.
  • Dynamická registrace prostřednictvím registerReceiver vyžaduje povinné volání unregisterReceiver pro zabránění úniku paměti.
  • Systémové Broadcasty zahrnují BOOT_COMPLETED, CONNECTIVITY_ACTION, BATTERY_LOW — každý obsahuje další data v Intent Extras.
  • Doba provádění onReceive je omezena na 10 sekund — pro dlouhodobé úlohy spusťte WorkManager nebo JobScheduler z přijímače.
  • Alternativy pro Broadcast Receiver v Android 8+: WorkManager pro úlohy na pozadí, JobScheduler pro periodické úlohy, NotificationListenerService pro monitorování oznámení.

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í.

Prodiskutovat projekt

Přečtěte si také