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 — 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.
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 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 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.
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 Broadcast | Kolejność | abortBroadcast | Wydajność |
|---|---|---|---|
| Normal | Nie gwarantowana | Nie działa | Wysoka (równoległa) |
| Ordered | Według priorytetu | Działa | Średnia (sekwencyjna) |
| Sticky | Jedna wartość | Nie dotyczy | Niska (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.
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 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.
<!-- 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 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.
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.
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.
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.
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.
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.
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.
// 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
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.
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.
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.
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.
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
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.
Przeczytaj również