Android BroadcastReceiver: gestione di eventi a livello di sistema
Cos'è un BroadcastReceiver?
A BroadcastReceiver è un componente Android che ascolta Intent broadcast a livello di sistema o definiti dall'app ed esegue logica breve in risposta. È il meccanismo publish-subscribe di Android.
Fonti di broadcast
- Eventi di sistema:
BOOT_COMPLETED,BATTERY_LOW,TIMEZONE_CHANGED,CONNECTIVITY_CHANGE,PACKAGE_INSTALLED - Hardware: Inserimento cuffie, pulsante fotocamera, eventi dock
- Altre app: Azioni personalizzate tramite
sendBroadcast(),sendOrderedBroadcast()
Registrazione: Statico vs. Dinamico
| Statico (Manifest) | Dinamico (Context.registerReceiver) |
|---|---|
Dichiarato in AndroidManifest.xml | Registrato in codice (Activity, Service, Application) |
| Sempre attivo (anche se l'app non è in esecuzione) | Attivo solo mentre il contesto di registrazione vive |
| Riceve broadcast impliciti ed espliciti | Può ricevere broadcast appiccicosi |
| Maggiore impatto sulla batteria (risveglia l'app) | Impatto minore, ciclo di vita con scope |
Obbligatorio per BOOT_COMPLETED | Preferito per eventi legati all'UI |
Il contratto del onReceive()
- Esegue sul thread principale (a meno che non si usi
goAsync()) - Deve completarsi in ~10 secondi (rischio ANR)
- Nessuna operazione UI — avvia Activity/Service invece
- Broadcast ordinati: Può chiamare
abortBroadcast(), passare il risultato al prossimo ricevitore
Pattern comuni
// Registrazione nel manifest <receiver android:name=".BootReceiver" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> // Registrazione dinamica (in Activity.onStart()) val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) registerReceiver(networkReceiver, filter) // In onStop() unregisterReceiver(networkReceiver) Alternative moderne (Android 8+)
- JobScheduler / WorkManager: Esecuzione differita e garantita con vincoli (ricarica, rete, inattività)
- Foreground Service: Task di lunga durata con notifica visibile all'utente
- LiveData / Flow + Lifecycle: Aggiornamenti UI reattivi invece di broadcast spaghetti
- Broadcast limitati: Molti broadcast impliciti non vengono più consegnati ai ricevitori nel manifest (es.
CONNECTIVITY_ACTION)
Best practice
- Mantieni
onReceive()minimo — delegana a WorkManager/Service - Usa
goAsync()per lavori leggermente più lunghi (ancora < ~30 s) - Imposta
android:exportedesplicitamente (obbligatorio per API 31+) - Valida l'azione e gli extra dell'Intent — non fidarti ciecamente
- Preferisci la registrazione dinamica per eventi accoppiati all'UI
Sommario
BroadcastReceiver è la colla per la notifica di eventi tra componenti, tra app e da sistema a app. Usalo per trigger brevi; affida il lavoro reale a WorkManager o Services.