Broadcast Receiver: cos’è, tipi di Broadcast e principio di funzionamento

Autore: IT Sectr Pubblicato: 2026-06-17 Tempo di lettura: 7 min

Broadcast Receiver è un componente Android che ascolta e processa i messaggi Broadcast di sistema, come cambiamenti di stato della rete, livello della batteria, ricezione di SMS o installazione di app. Viene avviato dal sistema operativo al verificarsi di un evento ed esegue il suo compito nel thread principale o attraverso un servizio in background. Secondo la Android Developer Guide, 2026, Broadcast Receiver consente a un’applicazione di reagire a eventi di sistema globali anche quando non è in esecuzione, rendendolo un meccanismo chiave per l’elaborazione di eventi in background nell’ecosistema Android.

Punti chiave

  • Broadcast Receiver è un componente Android per l’elaborazione asincrona di messaggi Broadcast di sistema e personalizzati.
  • Ordered Broadcast viene consegnato sequenzialmente per priorità e può essere interrotto da qualsiasi ricevitore.
  • Normal Broadcast viene consegnato a tutti gli abbonati simultaneamente — l’ordine di elaborazione non è garantito.
  • Registrazione può essere statica (nel manifest) o dinamica (nel codice tramite registerReceiver).
  • Restrizioni Android 8+ vieta la registrazione statica per molti Broadcast impliciti, riducendo il carico in background.

Cos’è un Broadcast Receiver?

Broadcast Receiver è un componente Android progettato per ricevere ed elaborare messaggi Intent distribuiti dal sistema operativo o da altre applicazioni. A differenza di Activity e Service, Broadcast Receiver non ha interfaccia utente — il suo compito è eseguire un’azione breve al verificarsi di un evento.

Broadcast Receiver funziona attraverso il meccanismo Intent. Il sistema o un’applicazione invia un Intent tramite sendBroadcast o sendOrderedBroadcast, e il sistema operativo lo consegna ai ricevitori registrati. Ogni ricevitore riceve l’Intent nel metodo onReceive, che viene eseguito nel thread principale.

Secondo il Android Compatibility Definition Document, un Broadcast Receiver deve completare onReceive entro 10 secondi — altrimenti il sistema lo considera bloccato e termina il processo. Per attività di lunga durata in background, utilizza JobScheduler o WorkManager avviati dal ricevitore.

Tipi di Broadcast in Android

Android supporta due tipi principali di Broadcast: Normal Broadcast e Ordered Broadcast. La differenza risiede nell’ordine di consegna e nella capacità di interrompere la catena di elaborazione. Inoltre, i Broadcast si dividono in di sistema (generati dal SO) e personalizzati (creati dall’applicazione).

Normal Broadcast

Normal Broadcast viene consegnato a tutti i ricevitori registrati in modo asincrono senza ordine garantito. Il sistema può elaborare questi Broadcast in parallelo — ogni ricevitore riceve l’Intent nel proprio thread. Chiamare abortBroadcast su Normal Broadcast non ha effetto: la consegna ad altri ricevitori non può essere annullata.

Ordered Broadcast

Ordered Broadcast viene consegnato sequenzialmente — a ciascun ricevitore in ordine decrescente dell’attributo android:priority (da 0 a 999). Dopo l’elaborazione, il ricevitore può passare il risultato al successivo tramite setResultExtras o interrompere la catena chiamando abortBroadcast. Viene utilizzato in scenari in cui l’ordine di elaborazione è importante — ad esempio, i ricevitori SMS.

Broadcast di sistema

Android genera molti Broadcast di sistema: ACTION_BOOT_COMPLETED (avvio del dispositivo), ACTION_BATTERY_LOW, ACTION_POWER_CONNECTED, CONNECTIVITY_ACTION, ACTION_PACKAGE_ADDED e altri. Ogni Intent contiene dati aggiuntivi in Extras — livello della batteria, tipo di connessione, nome del pacchetto.

Tipo di BroadcastOrdineabortBroadcastPrestazioni
NormalNon garantitoNon funzionaAlto (parallelo)
OrderedPer prioritàFunzionaMedio (sequenziale)
StickyValore singoloNon applicabileBasso (deprecato da API 21)

Sticky Broadcast è un tipo deprecato che conservava l’ultimo valore inviato. Invece, utilizza LiveData, StateFlow o SharedPreferences condivise per memorizzare l’ultimo stato.

Registrazione del Broadcast Receiver

Broadcast Receiver può essere registrato in due modi: staticamente tramite AndroidManifest.xml o dinamicamente nel codice tramite registerReceiver. La scelta dipende dallo scenario: la registrazione statica funziona anche se l’applicazione non è in esecuzione, quella dinamica solo finché il componente registrante è attivo.

Registrazione statica

La registrazione statica viene dichiarata nel manifest con il tag <receiver> all’interno di <application>. Per ogni ricevitore, vengono specificati la classe handler e un filtro Intent con le azioni da intercettare. Il sistema carica questi ricevitori al verificarsi di un Broadcast anche se l’applicazione non è in esecuzione.

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>

Registrazione dinamica

La registrazione dinamica viene eseguita utilizzando il metodo registerReceiver nel codice di Activity, Service o Fragment. Il ricevitore vive solo finché il componente che lo ha registrato è attivo. Chiama sempre unregisterReceiver in onPause o onDestroy — altrimenti si verifica una perdita di memoria e il sistema può terminare il processo.

Priorità e ordine di elaborazione

Per Ordered Broadcast, l’ordine di consegna è determinato dall’attributo android:priority. Un ricevitore con priorità più alta riceve l’Intent per primo. Se dopo l’elaborazione chiama abortBroadcast, i ricevitori con priorità inferiore non riceveranno l’Intent. Per i ricevitori statici, la priorità viene impostata nel filtro Intent del manifest.

Passaggio di dati tra ricevitori

I ricevitori in Ordered Broadcast possono passare dati al successivo nella catena tramite setResultExtras o setResultData. Ciò consente l’elaborazione in pipeline: il primo ricevitore arricchisce l’Intent con dati aggiuntivi, il secondo li utilizza, il terzo completa la catena. Il metodo getResultExtras legge i dati passati dal ricevitore precedente.

Per Normal Broadcast, l’ordine non è garantito, quindi tutti i ricevitori ricevono l’Intent originale invariato. Se hai bisogno che i ricevitori si influenzino a vicenda, utilizza sendOrderedBroadcast invece di sendBroadcast.

Restrizioni in Android 8 e versioni successive

Android 8 (API 26, Oreo) ha introdotto restrizioni significative sui Broadcast in background. La maggior parte dei Broadcast impliciti — quelli non indirizzati a un’applicazione specifica — non funzionano più con la registrazione statica. Il sistema blocca i ricevitori registrati nel manifest per azioni come CONNECTIVITY_ACTION o ACTION_BATTERY_LOW.

Cosa è cambiato

Google ha fissato un elenco di Broadcast che continuano a funzionare con la registrazione statica: BOOT_COMPLETED, TIME_TICK, Alarm e modifiche ai pacchetti — circa una dozzina di eccezioni in totale. Tutti gli altri Broadcast impliciti ora richiedono la registrazione dinamica tramite Context.registerReceiver, che funziona solo quando l’app è in primo piano.

Alternative a Broadcast Receiver

Per le attività in background che venivano precedentemente gestite tramite Broadcast Receiver, Android raccomanda WorkManager (attività differite con garanzia di esecuzione), JobScheduler (attività periodiche considerando lo stato del dispositivo) e NotificationListenerService (monitoraggio delle notifiche). Questi componenti funzionano senza le restrizioni di Android 8 e sono ottimizzati per il consumo energetico.

Esempio di Broadcast Receiver in Kotlin

Creiamo un Broadcast Receiver per monitorare la connettività di rete. Il ricevitore catturerà il Broadcast CONNECTIVITY_ACTION e registrerà il tipo di connessione. Per Android 8+, lo registreremo dinamicamente poiché si tratta di un Broadcast implicito escluso dalla registrazione statica.

kotlin
// Broadcast Receiver per il monitoraggio dello stato della rete
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", "Tipo di connessione: $connectionType")
    }
}

// Registrazione dinamica 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)
    }
}

Annulla sempre la registrazione del ricevitore in onStop — se l’Activity va in background ma il ricevitore rimane registrato, il sistema non può liberare risorse. Per Service, usa onDestroy. Nei fragment, registra il ricevitore in onStart e annulla la registrazione in onStop, seguendo il ciclo di vita del fragment.

Domande frequenti

Cos’è un Broadcast Receiver in Android?

Broadcast Receiver è un componente Android per l’elaborazione di messaggi Broadcast di sistema e personalizzati. Riceve un Intent nel metodo onReceive, che viene eseguito nel thread principale, e deve completarsi entro 10 secondi. Per attività lunghe, utilizza WorkManager o JobScheduler.

Qual è la differenza tra Normal Broadcast e Ordered Broadcast?

Normal Broadcast viene consegnato a tutti i ricevitori in modo asincrono e parallelo — l’ordine non è garantito, abortBroadcast non funziona. Ordered Broadcast viene consegnato sequenzialmente per priorità, ogni ricevitore può interrompere la catena o passare dati al successivo tramite setResultExtras.

Qual è la differenza tra registrazione statica e dinamica?

La registrazione statica (nel manifest) consente al ricevitore di funzionare anche se l’applicazione non è in esecuzione. La registrazione dinamica (tramite registerReceiver) funziona solo finché il componente registrante è attivo. A partire da Android 8, molti Broadcast impliciti richiedono la registrazione dinamica.

Quali restrizioni sono state introdotte in Android 8 per Broadcast Receiver?

Android 8 (API 26) ha vietato la registrazione statica per la maggior parte dei Broadcast impliciti, come CONNECTIVITY_ACTION o ACTION_BATTERY_LOW. Le eccezioni includono BOOT_COMPLETED, Alarm, ora e alcune altre. Per le attività in background, utilizza WorkManager invece di Broadcast.

Come passare dati da Broadcast Receiver ad Activity?

Utilizza LiveData, StateFlow, EventBus o LocalBroadcastManager per passare dati da onReceive all’interfaccia utente. Non tentare di aggiornare l’UI direttamente da onReceive — viene eseguito nel thread principale, ma il ricevitore non garantisce che l’Activity sia visibile. LocalBroadcastManager è un’opzione deprecata per la comunicazione interna.

Riepilogo

  • Broadcast Receiver è un componente di sistema Android per ricevere ed elaborare eventi globali tramite messaggi Intent dal SO o da altre applicazioni.
  • Normal Broadcast viene consegnato in parallelo senza garanzia d’ordine; Ordered Broadcast viene consegnato sequenzialmente per priorità con possibilità di interrompere la catena.
  • La registrazione statica nel manifest funziona per processi non ancora in esecuzione, ma è limitata in Android 8+ per la maggior parte dei Broadcast impliciti.
  • La registrazione dinamica tramite registerReceiver richiede una chiamata obbligatoria a unregisterReceiver per prevenire perdite di memoria.
  • System Broadcast include BOOT_COMPLETED, CONNECTIVITY_ACTION, BATTERY_LOW — ciascuno contiene dati aggiuntivi negli Extras dell’Intent.
  • Il tempo di esecuzione di onReceive è limitato a 10 secondi — per attività lunghe, avvia WorkManager o JobScheduler dal ricevitore.
  • Alternative a Broadcast Receiver in Android 8+: WorkManager per attività in background, JobScheduler per attività periodiche, NotificationListenerService per monitoraggio notifiche.

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche