Broadcast Receiver är en Android-komponent som lyssnar på och bearbetar system-Broadcast-meddelanden, såsom ändring av nätverksstatus, batterinivå, mottagning av SMS eller installation av appar. Den startas av operativsystemet när en händelse inträffar och utför uppgiften i huvudtråden eller via en bakgrundstjänst. Enligt Android Developer Guide, 2026 gör Broadcast Receiver det möjligt för appen att reagera på globala systemhändelser, även om den inte är startad, vilket gör den till en nyckelmekanism för bakgrundsbearbetning av händelser i Android-ekosystemet.
Huvudpunkter
Broadcast Receiver är en Android-komponent utformad för att ta emot och bearbeta Intent-meddelanden som sprids av operativsystemet eller andra appar. Till skillnad från Activity och Service har Broadcast Receiver inget användargränssnitt — dess uppgift är att utföra en kort uppgift när en händelse inträffar.
Broadcast Receiver fungerar genom Intent-mekanismen. Systemet eller appen skickar en Intent via sendBroadcast eller sendOrderedBroadcast, och operativsystemet levererar den till registrerade mottagare. Varje mottagare tar emot Intent i metoden onReceive, som utförs i huvudtråden.
Enligt Android Compatibility Definition Document måste Broadcast Receiver slutföra onReceive inom 10 sekunder — annars anser systemet att den har hängt sig och avslutar processen. För långvariga bakgrundsuppgifter, använd JobScheduler eller WorkManager som startas från mottagaren.
Android stöder två huvudtyper av Broadcast: Normal Broadcast och Ordered Broadcast. Skillnaden ligger i leveransordningen och möjligheten att avbryta bearbetningskedjan. Dessutom delas Broadcasts in i system (genererade av OS) och användare (skapade av appen).
Normal Broadcast levereras till alla registrerade mottagare asynkront och utan garanterad ordning. Systemet kan bearbeta sådana Broadcasts parallellt — varje mottagare tar emot Intent i sin egen tråd. Anrop av abortBroadcast i Normal Broadcast har ingen effekt: leverans till andra mottagare kan inte avbrytas.
Ordered Broadcast levereras sekventiellt — varje mottagare i fallande ordning av attributet android:priority (från 0 till 999). Efter bearbetning kan mottagaren skicka resultatet vidare till nästa via setResultExtras eller avbryta kedjan genom att anropa abortBroadcast. Detta används i scenarier där bearbetningsordningen är viktig — till exempel SMS-mottagare.
Android genererar många system-Broadcasts: ACTION_BOOT_COMPLETED (start av enheten), ACTION_BATTERY_LOW, ACTION_POWER_CONNECTED, CONNECTIVITY_ACTION, ACTION_PACKAGE_ADDED och andra. Varje Intent innehåller ytterligare data i Extras — batterinivå, anslutningstyp, paketnamn.
| Broadcast-typ | Ordning | abortBroadcast | Prestanda |
|---|---|---|---|
| Normal | Inte garanterad | Fungerar inte | Hög (parallell) |
| Ordered | Efter prioritet | Fungerar | Medel (sekventiell) |
| Sticky | Enstaka värde | Inte tillämpligt | Låg (föråldrad från API 21) |
Sticky Broadcast — en föråldrad typ som sparade det senast skickade värdet. Använd istället LiveData, StateFlow eller delade SharedPreferences för att lagra senaste tillståndet.
Broadcast Receiver kan registreras på två sätt: statiskt via AndroidManifest.xml eller dynamiskt i koden via registerReceiver. Valet beror på scenariot: statisk registrering fungerar även om appen inte är startad, dynamisk — endast så länge den registrerande komponenten är aktiv.
Statisk registrering deklareras i manifestet med taggen <receiver> inuti <application>. För varje mottagare anges hanterarklassen och ett Intent-filter med de åtgärder som ska fångas upp. Systemet laddar sådana mottagare när en Broadcast inträffar, även om appen inte är startad.
<!-- 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>
Dynamisk registrering utförs med metoden registerReceiver i koden för Activity, Service eller Fragment. Mottagaren lever endast så länge komponenten som registrerade den lever. Det är obligatoriskt att anropa unregisterReceiver i onPause eller onDestroy — annars uppstår en minnesläcka och systemet kan avsluta processen.
För Ordered Broadcast bestäms leveransordningen av attributet android:priority. En mottagare med högre prioritet tar emot Intent tidigare. Om den efter bearbetning anropar abortBroadcast kommer mottagare med lägre prioritet inte att få Intent. För statiska mottagare ställs prioriteten in i manifestets Intent-filter.
Mottagare i Ordered Broadcast kan överföra data till nästa i kedjan via setResultExtras eller setResultData. Detta möjliggör pipeline-bearbetning: första mottagaren berikar Intent med ytterligare data, den andra använder dem, den tredje slutför kedjan. Metoden getResultExtras läser data som överförts av föregående mottagare.
För Normal Broadcast är ordningen inte garanterad, så alla mottagare får den ursprungliga Intent oförändrad. Om du vill att mottagare ska påverka varandra, använd sendOrderedBroadcast istället för sendBroadcast.
Android 8 (API 26, Oreo) införde betydande begränsningar för bakgrunds-Broadcasts. De flesta implicita Broadcasts — de som inte är riktade till en specifik app — fungerar inte längre med statisk registrering. Systemet blockerar mottagare registrerade i manifestet för åtgärder som CONNECTIVITY_ACTION eller ACTION_BATTERY_LOW.
Google fastställde en lista över Broadcasts som fortsätter att fungera med statisk registrering: BOOT_COMPLETED, TIME_TICK, Alarm, INSTANCE? (paketändringar) — totalt cirka tio undantag. Alla andra implicita Broadcasts kräver nu dynamisk registrering via Context.registerReceiver, som endast fungerar när appen är i förgrunden.
För bakgrundsuppgifter som tidigare löstes genom Broadcast Receiver rekommenderar Android WorkManager (fördröjda uppgifter med exekveringsgaranti), JobScheduler (periodiska uppgifter med hänsyn till enhetens status) och NotificationListenerService (övervakning av aviseringar). Dessa komponenter fungerar utan Android 8:s begränsningar och är optimerade för energiförbrukning.
Låt oss skapa en Broadcast Receiver för att övervaka nätverksanslutningen. Mottagaren kommer att ta emot Broadcast CONNECTIVITY_ACTION och logga anslutningstypen. För Android 8+ registrerar vi den dynamiskt, eftersom detta är en implicit Broadcast som är utesluten från statisk registrering.
// Broadcast Receiver för övervakning av nätverksstatus
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", "Anslutningstyp: $connectionType")
}
}
// Dynamisk registrering i 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)
}
}
Avregistrera alltid mottagaren i onStop — om Activity går till bakgrunden men mottagaren förblir registrerad kan systemet inte frigöra resurser. För Service, använd onDestroy. I fragment registrerar du mottagaren i onStart och avregistrerar i onStop, enligt fragmentets livscykel.
Vanliga frågor
Broadcast Receiver är en Android-komponent för bearbetning av system- och användar-Broadcast-meddelanden. Den tar emot Intent i metoden onReceive, som utförs i huvudtråden och måste slutföras inom 10 sekunder. För långvariga uppgifter, använd WorkManager eller JobScheduler.
Normal Broadcast levereras till alla mottagare asynkront och parallellt — ordningen är inte garanterad, abortBroadcast fungerar inte. Ordered Broadcast överförs sekventiellt baserat på prioritet, varje mottagare kan avbryta kedjan eller överföra data via setResultExtras.
Statisk registrering (i manifestet) gör att mottagaren kan fungera även om appen inte är startad. Dynamisk (via registerReceiver) fungerar endast så länge den registrerande komponenten är aktiv. Från och med Android 8 kräver många implicita Broadcasts dynamisk registrering.
Android 8 (API 26) förbjöd statisk registrering för de flesta implicita Broadcasts, såsom CONNECTIVITY_ACTION eller ACTION_BATTERY_LOW. Undantag inkluderar BOOT_COMPLETED, Alarm, tid och några andra. För bakgrundsuppgifter, använd WorkManager istället för Broadcast.
Använd LiveData, StateFlow, EventBus eller LocalBroadcastManager för att överföra data från onReceive till UI. Försök inte att uppdatera UI direkt från onReceive — den utförs i huvudtråden, men mottagaren garanterar inte att Activity är synlig. LocalBroadcastManager är ett föråldrat alternativ för intern kommunikation.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också