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.

A clean technical illustration showing the Android BroadcastReceiver concept. A central Android robot icon emits radio waves. Around it, multiple colored icons represent system events: airplane mode toggle, battery low warning, network connection/disconnection, and a custom app event. Arrows flow from these icons toward a receiver component labeled "BroadcastReceiver" which then triggers an app response. Modern flat design style, blue and green color palette, dark background.

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 una Activity o Service. 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() con registerReceiver() e un IntentFilter
  • La cancellazione del receiver in onPause() con unregisterReceiver() 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 / CostanteDescrizione
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.
IntentFilterClasse che definisce quali azioni di intent devono attivare il BroadcastReceiver (es. Intent.ACTION_AIRPLANE_MODE_CHANGED).
Intent.ACTION_AIRPLANE_MODE_CHANGEDCostante 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() (o onStart()) e cancellalo in onPause() (o onStop()) per allinearti al ciclo di vita.
  • Gestire troppa logica in onReceive(): mantieni onReceive() 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: