Broadcast Receiver — een Android-component die systeem-Broadcast-berichten beluistert en verwerkt, zoals verandering van netwerkstatus, batterijniveau, ontvangst van SMS of installatie van een app. Het wordt gestart door het besturingssysteem wanneer een gebeurtenis plaatsvindt en voert de taak uit in de hoofdthread of via een achtergrondservice. Volgens Android Developer Guide, 2026 stelt Broadcast Receiver een app in staat te reageren op globale systeemgebeurtenissen, zelfs als deze niet is gestart, wat het een sleutelmechanisme maakt voor achtergrondverwerking van gebeurtenissen in het Android-ecosysteem.
Belangrijkste punten
Broadcast Receiver — is een Android-component ontworpen voor het ontvangen en verwerken van Intent-berichten die worden verspreid door het besturingssysteem of andere apps. In tegenstelling tot Activity en Service heeft Broadcast Receiver geen gebruikersinterface — zijn taak is het uitvoeren van een korte taak wanneer een gebeurtenis plaatsvindt.
Broadcast Receiver werkt via het Intent-mechanisme. Het systeem of de app verzendt een Intent via sendBroadcast of sendOrderedBroadcast, en het besturingssysteem levert deze aan geregistreerde ontvangers. Elke ontvanger ontvangt de Intent in de onReceive-methode, die in de hoofdthread wordt uitgevoerd.
Volgens het Android Compatibility Definition Document moet Broadcast Receiver onReceive binnen 10 seconden voltooien — anders beschouwt het systeem het als vastgelopen en beëindigt het proces. Gebruik voor langdurige achtergrondtaken JobScheduler of WorkManager, gestart vanuit de ontvanger.
Android ondersteunt twee hoofdtypen Broadcast: Normal Broadcast en Ordered Broadcast. Het verschil zit in de leveringsvolgorde en de mogelijkheid om de verwerkingsketen te onderbreken. Daarnaast worden Broadcasts onderverdeeld in systeem (door OS gegenereerd) en gebruiker (door app gemaakt).
Normal Broadcast wordt asynchroon en zonder gegarandeerde volgorde aan alle geregistreerde ontvangers geleverd. Het systeem kan dergelijke Broadcasts parallel verwerken — elke ontvanger ontvangt de Intent in zijn eigen thread. Aanroep van abortBroadcast in Normal Broadcast heeft geen effect: levering aan andere ontvangers kan niet worden geannuleerd.
Ordered Broadcast wordt sequentieel geleverd — elke ontvanger in aflopende volgorde van het android:priority-attribuut (van 0 tot 999). Na verwerking kan de ontvanger het resultaat doorgeven aan de volgende via setResultExtras of de keten onderbreken met abortBroadcast. Dit wordt gebruikt in scenario's waar de verwerkingsvolgorde belangrijk is — bijvoorbeeld SMS-ontvangers.
Android genereert talrijke systeem-Broadcasts: ACTION_BOOT_COMPLETED (opstarten apparaat), ACTION_BATTERY_LOW, ACTION_POWER_CONNECTED, CONNECTIVITY_ACTION, ACTION_PACKAGE_ADDED en andere. Elke Intent bevat extra gegevens in Extras — batterijniveau, verbindingstype, pakketnaam.
| Broadcast-type | Volgorde | abortBroadcast | Prestaties |
|---|---|---|---|
| Normal | Niet gegarandeerd | Werkt niet | Hoog (parallel) |
| Ordered | Op prioriteit | Werkt | Gemiddeld (sequentieel) |
| Sticky | Enkele waarde | Niet van toepassing | Laag (verouderd vanaf API 21) |
Sticky Broadcast — een verouderd type dat de laatst verzonden waarde bewaarde. Gebruik in plaats daarvan LiveData, StateFlow of gedeelde SharedPreferences voor het opslaan van de laatste status.
Broadcast Receiver kan op twee manieren worden geregistreerd: statisch via AndroidManifest.xml of dynamisch in code via registerReceiver. De keuze hangt af van het scenario: statische registratie werkt zelfs als de app niet is gestart, dynamische — alleen zolang de registrerende component actief is.
Statische registratie wordt in het manifest gedeclareerd met de tag <receiver> binnen <application>. Voor elke ontvanger wordt de verwerkingsklasse en een Intent-filter met de te onderscheppen acties opgegeven. Het systeem laadt dergelijke ontvangers bij het optreden van een Broadcast, zelfs als de app niet is gestart.
<!-- 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>
Dynamische registratie wordt uitgevoerd met de methode registerReceiver in de code van Activity, Service of Fragment. De ontvanger leeft alleen zolang de component die hem heeft geregistreerd leeft. Roep altijd unregisterReceiver aan in onPause of onDestroy — anders treedt een geheugenlek op en kan het systeem het proces beëindigen.
Voor Ordered Broadcast wordt de leveringsvolgorde bepaald door het attribuut android:priority. Een ontvanger met hogere prioriteit ontvangt de Intent eerder. Als hij na verwerking abortBroadcast aanroept, ontvangen ontvangers met lagere prioriteit de Intent niet. Voor statische ontvangers wordt de prioriteit ingesteld in het Intent-filter van het manifest.
Ontvangers in Ordered Broadcast kunnen gegevens doorgeven aan de volgende in de keten via setResultExtras of setResultData. Dit maakt pijplijnverwerking mogelijk: de eerste ontvanger verrijkt de Intent met extra gegevens, de tweede gebruikt ze, de derde voltooit de keten. De methode getResultExtras leest de door de vorige ontvanger doorgegeven gegevens.
Voor Normal Broadcast is de volgorde niet gegarandeerd, dus alle ontvangers ontvangen de originele Intent ongewijzigd. Als u wilt dat ontvangers elkaar beïnvloeden, gebruikt u sendOrderedBroadcast in plaats van sendBroadcast.
Android 8 (API 26, Oreo) introduceerde aanzienlijke beperkingen voor achtergrond-Broadcasts. De meeste impliciete Broadcasts — die niet aan een specifieke app zijn gericht — werken niet meer met statische registratie. Het systeem blokkeert ontvangers die in het manifest zijn geregistreerd voor acties zoals CONNECTIVITY_ACTION of ACTION_BATTERY_LOW.
Google heeft een lijst vastgesteld van Broadcasts die nog steeds werken met statische registratie: BOOT_COMPLETED, TIME_TICK, Alarm, INSTANCE? (pakketwijzigingen) — in totaal ongeveer tien uitzonderingen. Alle andere impliciete Broadcasts vereisen nu dynamische registratie via Context.registerReceiver, die alleen werkt wanneer de app op de voorgrond is.
Voor achtergrondtaken die voorheen via Broadcast Receiver werden opgelost, beveelt Android WorkManager (uitgestelde taken met uitvoeringsgarantie), JobScheduler (periodieke taken rekening houdend met apparaatstatus) en NotificationListenerService (meldingsmonitoring) aan. Deze componenten werken zonder de beperkingen van Android 8 en zijn geoptimaliseerd voor energieverbruik.
Laten we een Broadcast Receiver maken voor het volgen van de netwerkverbinding. De ontvanger ontvangt de Broadcast CONNECTIVITY_ACTION en logt het verbindingstype. Voor Android 8+ registreren we hem dynamisch, omdat dit een impliciete Broadcast is die is uitgesloten van statische registratie.
// Broadcast Receiver voor netwerkstatusregistratie
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", "Verbindingstype: $connectionType")
}
}
// Dynamische registratie in 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)
}
}
Annuleer altijd de registratie van de ontvanger in onStop — als de Activity naar de achtergrond gaat maar de ontvanger geregistreerd blijft, kan het systeem geen bronnen vrijgeven. Gebruik voor Service onDestroy. In fragmenten registreert u de ontvanger in onStart en annuleert u in onStop, volgens de levenscyclus van het fragment.
Veelgestelde vragen
Broadcast Receiver — een Android-component voor het verwerken van systeem- en gebruikers-Broadcast-berichten. Het ontvangt de Intent in de onReceive-methode, die in de hoofdthread wordt uitgevoerd en binnen 10 seconden moet worden voltooid. Gebruik WorkManager of JobScheduler voor langdurige taken.
Normal Broadcast wordt asynchroon en parallel aan alle ontvangers geleverd — volgorde is niet gegarandeerd, abortBroadcast werkt niet. Ordered Broadcast wordt sequentieel verzonden op basis van prioriteit, elke ontvanger kan de keten onderbreken of gegevens doorgeven via setResultExtras.
Statische registratie (in het manifest) stelt de ontvanger in staat te werken, zelfs als de app niet is gestart. Dynamische (via registerReceiver) werkt alleen zolang de registrerende component actief is. Vanaf Android 8 vereisen veel impliciete Broadcasts dynamische registratie.
Android 8 (API 26) heeft statische registratie verboden voor de meeste impliciete Broadcasts, zoals CONNECTIVITY_ACTION of ACTION_BATTERY_LOW. Uitzonderingen zijn BOOT_COMPLETED, Alarm, tijd en enkele andere. Gebruik WorkManager in plaats van Broadcast voor achtergrondtaken.
Gebruik LiveData, StateFlow, EventBus of LocalBroadcastManager om gegevens van onReceive naar de UI door te geven. Probeer de UI niet rechtstreeks vanuit onReceive bij te werken — het wordt uitgevoerd in de hoofdthread, maar de ontvanger garandeert niet dat de Activity zichtbaar is. LocalBroadcastManager is een verouderde optie voor interne communicatie.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook