>> Tecnologia elettronica >  >> Audio domestico >> Ricevitori AV

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.xmlRegistrato 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 esplicitiPuò ricevere broadcast appiccicosi
Maggiore impatto sulla batteria (risveglia l'app)Impatto minore, ciclo di vita con scope
Obbligatorio per BOOT_COMPLETEDPreferito 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:exported esplicitamente (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.