Broadcast Receiver: co to jest, rodzaje Broadcast i zasada działania

Autor: IT Sectr Opublikowano: 2026-06-17 Czas czytania: 7 min

Broadcast Receiver — to komponent Androida, który nasłuchuje i przetwarza systemowe komunikaty Broadcast, takie jak zmiana stanu sieci, poziom naładowania baterii, otrzymanie SMS lub instalacja aplikacji. Jest uruchamiany przez system operacyjny po wystąpieniu zdarzenia i wykonuje zadanie w głównym wątku lub poprzez usługę działającą w tle. Według Android Developer Guide, 2026, Broadcast Receiver pozwala aplikacji reagować na globalne zdarzenia systemowe, nawet jeśli nie jest uruchomiona, co czyni go kluczowym mechanizmem do przetwarzania zdarzeń w tle w ekosystemie Androida.

Najważniejsze

  • Broadcast Receiver — komponent Androida do asynchronicznego przetwarzania systemowych i niestandardowych komunikatów Broadcast.
  • Ordered Broadcast jest przekazywany sekwencyjnie według priorytetu i może zostać przerwany przez dowolny odbiornik.
  • Normal Broadcast jest dostarczany do wszystkich subskrybentów jednocześnie — kolejność przetwarzania nie jest gwarantowana.
  • Rejestracja może być statyczna (w manifeście) lub dynamiczna (w kodzie przez registerReceiver).
  • Ograniczenia Android 8+ zabraniają statycznej rejestracji dla wielu niejawnych Broadcast, co zmniejsza obciążenie w tle.

Co to jest Broadcast Receiver?

Broadcast Receiver — to komponent Androida przeznaczony do odbierania i przetwarzania komunikatów Intent, które są rozpowszechniane przez system operacyjny lub inne aplikacje. W przeciwieństwie do Activity i Service, Broadcast Receiver nie ma interfejsu użytkownika — jego zadaniem jest wykonanie krótkiego zadania po wystąpieniu zdarzenia.

Broadcast Receiver działa poprzez mechanizm Intent. System lub aplikacja wysyła Intent przez sendBroadcast lub sendOrderedBroadcast, a system operacyjny dostarcza go do zarejestrowanych odbiorników. Każdy odbiornik otrzymuje Intent w metodzie onReceive, która jest wykonywana w głównym wątku.

Według Android Compatibility Definition Document, Broadcast Receiver musi zakończyć onReceive w ciągu 10 sekund — w przeciwnym razie system uznaje go za zawieszony i kończy proces. Do długotrwałych zadań w tle używaj JobScheduler lub WorkManager, uruchomionych z odbiornika.

Rodzaje Broadcast w Androidzie

Android obsługuje dwa główne typy Broadcast: Normal Broadcast i Ordered Broadcast. Różnica polega na kolejności dostarczania i możliwości przerwania łańcucha przetwarzania. Ponadto Broadcast dzielą się na systemowe (generowane przez OS) i niestandardowe (tworzone przez aplikację).

Normal Broadcast

Normal Broadcast jest dostarczany do wszystkich zarejestrowanych odbiorników asynchronicznie i bez gwarantowanej kolejności. System może przetwarzać takie Broadcast równolegle — każdy odbiornik otrzymuje Intent we własnym wątku. Wywołanie abortBroadcast w Normal Broadcast nie ma efektu: nie można anulować dostarczenia do innych odbiorników.

Ordered Broadcast

Ordered Broadcast jest dostarczany sekwencyjnie — każdemu odbiornikowi w kolejności malejącej atrybutu android:priority (od 0 do 999). Po przetworzeniu odbiornik może przekazać wynik następnemu przez setResultExtras lub przerwać łańcuch wywołaniem abortBroadcast. Jest to używane w scenariuszach, gdzie kolejność przetwarzania jest ważna — na przykład odbiorniki SMS.

Broadcast systemowe

Android generuje wiele Broadcast systemowych: ACTION_BOOT_COMPLETED (uruchomienie urządzenia), ACTION_BATTERY_LOW, ACTION_POWER_CONNECTED, CONNECTIVITY_ACTION, ACTION_PACKAGE_ADDED i inne. Każdy Intent zawiera dodatkowe dane w Extras — poziom naładowania, typ połączenia, nazwę pakietu.

Typ BroadcastKolejnośćabortBroadcastWydajność
NormalNie gwarantowanaNie działaWysoka (równoległa)
OrderedWedług priorytetuDziałaŚrednia (sekwencyjna)
StickyJedna wartośćNie dotyczyNiska (przestarzałe od API 21)

Sticky Broadcast — przestarzały typ, który przechowywał ostatnią wysłaną wartość. Zamiast niego używaj LiveData, StateFlow lub współdzielonych SharedPreferences do przechowywania ostatniego stanu.

Rejestracja Broadcast Receiver

Broadcast Receiver można zarejestrować na dwa sposoby: statycznie przez AndroidManifest.xml lub dynamicznie w kodzie przez registerReceiver. Wybór zależy od scenariusza: statyczna rejestracja działa nawet jeśli aplikacja nie jest uruchomiona, dynamiczna — tylko gdy aktywny jest komponent rejestrujący.

Rejestracja statyczna

Rejestracja statyczna jest deklarowana w manifeście tagiem <receiver> wewnątrz <application>. Dla każdego odbiornika określa się klasę obsługującą i filtr Intent z akcjami, które ma przechwytywać. System ładuje takie odbiorniki po wystąpieniu Broadcast nawet jeśli aplikacja nie jest uruchomiona.

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>

Rejestracja dynamiczna

Rejestracja dynamiczna jest wykonywana metodą registerReceiver w kodzie Activity, Service lub Fragment. Odbiornik żyje tylko tak długo, jak długo żyje komponent, który go zarejestrował. Koniecznie wywołuj unregisterReceiver w onPause lub onDestroy — w przeciwnym razie nastąpi wyciek pamięci, a system może zakończyć proces.

Priorytet i kolejność przetwarzania

Dla Ordered Broadcast kolejność dostarczania jest określana przez atrybut android:priority. Odbiornik z wyższym priorytetem otrzymuje Intent wcześniej. Jeśli po przetworzeniu wywoła abortBroadcast, odbiorniki z niższym priorytetem nie otrzymają Intent. Dla odbiorników statycznych priorytet jest ustawiany w filtrze Intent w manifeście.

Przekazywanie danych między odbiornikami

Odbiorniki w Ordered Broadcast mogą przekazywać dane następnemu w łańcuchu przez setResultExtras lub setResultData. Pozwala to zorganizować przetwarzanie potokowe: pierwszy odbiornik wzbogaca Intent o dodatkowe dane, drugi je wykorzystuje, trzeci kończy łańcuch. Metoda getResultExtras odczytuje dane przekazane przez poprzedni odbiornik.

Dla Normal Broadcast kolejność nie jest gwarantowana, więc wszystkie odbiorniki otrzymują oryginalny Intent bez zmian. Jeśli potrzebujesz, aby odbiorniki wpływały na siebie nawzajem — używaj sendOrderedBroadcast zamiast sendBroadcast.

Ograniczenia w Android 8 i nowszych

Android 8 (API 26, Oreo) wprowadził istotne ograniczenia dotyczące Broadcast w tle. Większość niejawnych (implicit) Broadcast — tych, które nie są adresowane do konkretnej aplikacji — nie działa już ze statyczną rejestracją. System blokuje odbiorniki zarejestrowane w manifeście dla takich akcji jak CONNECTIVITY_ACTION czy ACTION_BATTERY_LOW.

Co się zmieniło

Google ustalił listę Broadcast, które nadal działają ze statyczną rejestracją: BOOT_COMPLETED, TIME_TICK, Alarm, INSTANCE? (zmiany pakietów) — łącznie około kilkunastu wyjątków. Wszystkie pozostałe niejawne Broadcast wymagają teraz dynamicznej rejestracji przez Context.registerReceiver, która działa tylko gdy aplikacja jest na pierwszym planie.

Alternatywy dla Broadcast Receiver

Do zadań w tle, które wcześniej były realizowane przez Broadcast Receiver, Android zaleca WorkManager (zadania opóźnione z gwarancją wykonania), JobScheduler (zadania okresowe z uwzględnieniem stanu urządzenia) i NotificationListenerService (monitorowanie powiadomień). Te komponenty działają bez ograniczeń Android 8 i są zoptymalizowane pod kątem zużycia energii.

Przykład Broadcast Receiver w Kotlinie

Rozważmy stworzenie Broadcast Receiver do śledzenia połączenia sieciowego. Odbiornik będzie otrzymywać Broadcast CONNECTIVITY_ACTION i logować typ połączenia. Dla Android 8+ zarejestrujemy go dynamicznie, ponieważ jest to niejawny Broadcast wyłączony ze statycznej rejestracji.

kotlin
// Broadcast Receiver do śledzenia stanu sieci
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 połączenia: $connectionType")
    }
}

// Dynamiczna rejestracja w 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)
    }
}

Koniecznie anuluj rejestrację odbiornika w onStop — jeśli Activity przejdzie w tło, ale odbiornik pozostanie zarejestrowany, system nie będzie mógł zwolnić zasobów. Dla Service używaj onDestroy. We fragmentach rejestruj odbiornik w onStart i anuluj w onStop, zgodnie z cyklem życia fragmentu.

Często zadawane pytania

Co to jest Broadcast Receiver w Androidzie?

Broadcast Receiver — to komponent Androida do przetwarzania systemowych i niestandardowych komunikatów Broadcast. Otrzymuje Intent w metodzie onReceive, która jest wykonywana w głównym wątku, i musi zakończyć się w ciągu 10 sekund. Do długotrwałych zadań używaj WorkManager lub JobScheduler.

Czym różni się Normal Broadcast od Ordered Broadcast?

Normal Broadcast jest dostarczany do wszystkich odbiorników asynchronicznie i równolegle — kolejność nie jest gwarantowana, abortBroadcast nie działa. Ordered Broadcast jest przekazywany sekwencyjnie według priorytetu, każdy odbiornik może przerwać łańcuch lub przekazać dane następnemu przez setResultExtras.

Jaka jest różnica między rejestracją statyczną a dynamiczną?

Statyczna rejestracja (w manifeście) pozwala odbiornikowi działać nawet jeśli aplikacja nie jest uruchomiona. Dynamiczna (przez registerReceiver) działa tylko gdy aktywny jest komponent rejestrujący. Od Android 8 wiele niejawnych Broadcast wymaga dynamicznej rejestracji.

Jakie ograniczenia pojawiły się w Android 8 dla Broadcast Receiver?

Android 8 (API 26) zabronił statycznej rejestracji dla większości niejawnych Broadcast, takich jak CONNECTIVITY_ACTION czy ACTION_BATTERY_LOW. Wyjątki obejmują BOOT_COMPLETED, Alarm, czas i kilka innych. Do zadań w tle zamiast Broadcast używaj WorkManager.

Jak przekazać dane z Broadcast Receiver do Activity?

Używaj LiveData, StateFlow, EventBus lub LocalBroadcastManager do przekazywania danych z onReceive do UI. Nie próbuj aktualizować UI bezpośrednio z onReceive — jest wykonywany w głównym wątku, ale odbiornik nie gwarantuje, że Activity jest widoczne. LocalBroadcastManager to przestarzała opcja do komunikacji wewnętrznej.

Podsumowanie

  • Broadcast Receiver — systemowy komponent Androida do odbierania i przetwarzania globalnych zdarzeń poprzez komunikaty Intent od OS lub innych aplikacji.
  • Normal Broadcast jest dostarczany równolegle bez gwarancji kolejności; Ordered Broadcast jest przekazywany sekwencyjnie według priorytetu z możliwością przerwania łańcucha.
  • Statyczna rejestracja w manifeście działa dla procesów, które jeszcze nie są uruchomione, ale jest ograniczona w Android 8+ dla większości niejawnych Broadcast.
  • Dynamiczna rejestracja przez registerReceiver wymaga obowiązkowego wywołania unregisterReceiver w celu zapobieżenia wyciekowi pamięci.
  • System Broadcast obejmują BOOT_COMPLETED, CONNECTIVITY_ACTION, BATTERY_LOW — każdy zawiera dodatkowe dane w Extras Intent.
  • Czas wykonania onReceive jest ograniczony do 10 sekund — do długotrwałych zadań uruchamiaj WorkManager lub JobScheduler z odbiornika.
  • Alternatywy dla Broadcast Receiver w Android 8+: WorkManager do zadań w tle, JobScheduler do zadań okresowych, NotificationListenerService do monitorowania powiadomień.

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również