BroadcastReceiver Android: Guida Completa con Esempi Java
Se stai cercando di capire come funziona un BroadcastReceiver Android e quando dovresti usarlo nella tua app, questa guida pratica fa per te. Vedremo passo dopo passo come intercettare eventi di sistema e personalizzati utilizzando Java e Android Studio, così da reagire in modo affidabile a cambi di stato come modalità aereo, batteria scarica o notifiche interne. Troverai esempi chiari, spiegazioni semplici e consigli per evitare gli errori più comuni, anche se sei alle prime armi con lo sviluppo Android. Continua a leggere per scoprire come integrare i BroadcastReceiver Android nel tuo progetto in modo sicuro ed efficace.

In questa guida vedremo cos’è BroadcastReceiver Android e come utilizzarlo per reagire agli eventi generati dal sistema o dalla tua app, come cambi di modalità aereo, batteria scarica o notifiche personalizzate. Partiremo da zero in Java all’interno di Android Studio, così che sviluppatori principianti e intermedi possano imparare a registrare e gestire correttamente i broadcast, evitando errori comuni di ciclo di vita e sicurezza. Se vuoi capire davvero come funzionano i BroadcastReceiver Android, continua a seguire questa guida.
Cos’è BroadcastReceiver
Un BroadcastReceiver è un componente di Android che permette alla tua app di ricevere e reagire a messaggi broadcast inviati dal sistema operativo o da altre applicazioni. Questi messaggi vengono incapsulati in un oggetto Intent e possono rappresentare eventi come:
- Attivazione o disattivazione della modalità aereo
- Stato della batteria (scarica, in carica, completa)
- Connessione o disconnessione della rete
- Eventi personalizzati inviati dalla tua stessa app
Registrando correttamente un BroadcastReceiver, puoi eseguire codice in risposta a questi eventi, anche quando la tua activity non è in primo piano (con le dovute limitazioni di versione Android e permessi).
Tipi di BroadcastReceiver
I BroadcastReceiver possono essere registrati in due modi principali:
- Statici (nel Manifest): dichiarati nel file
AndroidManifest.xml. Vengono attivati anche se l’app non è in esecuzione, ma sono soggetti a molte restrizioni nelle versioni Android moderne. - Dinamici (a runtime): registrati nel codice Java/Kotlin tramite
registerReceiver(), tipicamente all’interno del ciclo di vita di unaActivityoService. Sono più flessibili e consigliati per molti casi d’uso.
In questa guida ci concentreremo su un BroadcastReceiver dinamico che intercetta le modifiche alla modalità aereo.
Esempio Android: rilevare la modalità aereo con BroadcastReceiver
Nell’esempio seguente realizziamo una MainActivity che registra un BroadcastReceiver interno per ascoltare l’intent Intent.ACTION_AIRPLANE_MODE_CHANGED. Ogni volta che l’utente attiva o disattiva la modalità aereo, verrà mostrato un Toast che indica lo stato corrente.
La logica principale si basa su tre elementi:
- Un BroadcastReceiver interno chiamato
AirplaneModeReceiver - La registrazione del receiver in
onResume()conregisterReceiver()e unIntentFilter - La cancellazione del receiver in
onPause()conunregisterReceiver()per evitare memory leak
MainActivity.java completo con BroadcastReceiver Android
Di seguito il codice completo della MainActivity.java con il BroadcastReceiver per la modalità aereo, riscritto in modo pulito e leggibile.
package com.example.broadcastReceiver.activities;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.provider.Settings;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.broadcastReceiver.R;
public class MainActivity extends AppCompatActivity {
private AirplaneModeReceiver airplaneModeReceiver = new AirplaneModeReceiver();
/**
* BroadcastReceiver interno per ascoltare i cambi di modalità aereo.
*/
private class AirplaneModeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (isAirplaneMode(context.getApplicationContext())) {
Toast.makeText(context, "Airplane mode is ON", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(context, "Airplane mode is OFF", Toast.LENGTH_LONG).show();
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);
// Registriamo il receiver solo se il context è valido
if (getApplicationContext() != null) {
registerReceiver(airplaneModeReceiver, intentFilter);
}
}
@Override
protected void onPause() {
super.onPause();
// Rimuoviamo il receiver per evitare memory leak
if (getApplicationContext() != null) {
unregisterReceiver(airplaneModeReceiver);
}
}
/**
* Restituisce true se la modalità aereo è attiva, false altrimenti.
*/
private boolean isAirplaneMode(Context context) {
return Settings.System.getInt(
context.getContentResolver(),
Settings.System.AIRPLANE_MODE_ON,
0
) != 0;
}
}
Registrazione e cancellazione del BroadcastReceiver Android
I metodi chiave per gestire un BroadcastReceiver dinamico sono registerReceiver() e unregisterReceiver(), insieme alla corretta implementazione di onReceive(). Ecco uno snippet isolato dei punti più importanti:
Per approfondire, consulta la documentazione ufficiale BroadcastReceiver e la guida ufficiale ai Broadcast Android sul sito ufficiale di Google.
@Override
protected void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);
if (getApplicationContext() != null) {
registerReceiver(airplaneModeReceiver, intentFilter);
}
}
@Override
protected void onPause() {
super.onPause();
if (getApplicationContext() != null) {
unregisterReceiver(airplaneModeReceiver);
}
}
private class AirplaneModeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (isAirplaneMode(context.getApplicationContext())) {
Toast.makeText(context, "Airplane mode is ON", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(context, "Airplane mode is OFF", Toast.LENGTH_LONG).show();
}
}
}
Ricorda sempre di cancellare il receiver nel momento corretto del ciclo di vita (ad esempio in onPause() o onStop()) per evitare crash e perdite di memoria.
Metodi principali del BroadcastReceiver Android
La tabella seguente riassume i metodi e le classi più importanti utilizzate in questo esempio di BroadcastReceiver per la modalità aereo.
| Metodo / Costante | Descrizione |
|---|---|
registerReceiver() | Registra un BroadcastReceiver dinamico con un determinato IntentFilter per iniziare ad ascoltare i broadcast. |
unregisterReceiver() | Rimuove un BroadcastReceiver precedentemente registrato per evitare memory leak e ascolti non desiderati. |
onReceive() | Metodo chiamato automaticamente quando viene ricevuto un broadcast che corrisponde all’IntentFilter registrato. |
IntentFilter | Classe che definisce quali azioni di intent devono attivare il BroadcastReceiver (es. Intent.ACTION_AIRPLANE_MODE_CHANGED). |
Intent.ACTION_AIRPLANE_MODE_CHANGED | Costante che identifica il broadcast inviato dal sistema quando la modalità aereo viene attivata o disattivata. |
Errori comuni e best practice con BroadcastReceiver Android
- Dimenticare di chiamare
unregisterReceiver(): porta facilmente a memory leak e potenziali crash quando l’activity viene distrutta. - Registrare il receiver nel posto sbagliato: registra il receiver in
onResume()(oonStart()) e cancellalo inonPause()(oonStop()) per allinearti al ciclo di vita. - Gestire troppa logica in
onReceive(): mantienionReceive()leggero, delegando eventualmente a metodi o componenti separati per operazioni più pesanti. - Ignorare le modifiche di sicurezza introdotte nelle nuove versioni di Android: alcuni broadcast impliciti non possono più essere ricevuti se dichiarati solo nel Manifest; preferisci i receiver dinamici quando possibile.
- Non controllare i permessi: per alcuni broadcast (es. legati a SMS, telefono, ecc.) servono permessi specifici dichiarati nel Manifest e richiesti a runtime.
Seguendo queste best practice, il tuo BroadcastReceiver sarà più stabile, sicuro e semplice da manutenere.
Conclusioni: BroadcastReceiver Android in sintesi
In questa guida hai visto come funziona un BroadcastReceiver Android, quali sono i suoi tipi principali e come implementare un esempio pratico per rilevare la modalità aereo usando Java. Partendo dalla comprensione degli Intent fino alla registrazione e cancellazione del receiver, ora hai le basi per integrare questo componente in modo sicuro nelle tue app.
Per continuare ad approfondire lo sviluppo Android, dai un’occhiata anche a questi articoli correlati:
- Notifiche avanzate con InboxStyle
- Come creare e gestire le notifiche Android
- Realizzare un QR Code Scanner in Android