Sobes.tech
Junior

Come collegare un BroadcastReceiver per ricevere messaggi su Android?

sobes.tech AI

Risposta dell'AI

Esistono due metodi principali:

  1. Registrazione dinamica:

    • Si registra e si annulla programmaticamente nel codice.
    • Dura finché l'oggetto che lo ha registrato è attivo.
    • È usato per eventi che non devono essere ricevuti continuamente o quando l'applicazione non è attiva (ad esempio, durante il cambio di orientamento, livello di batteria).
    // In Activity o Fragment
    private val receiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            // Elaborazione del messaggio ricevuto
            intent?.action?.let { action ->
                when (action) {
                    Intent.ACTION_BATTERY_CHANGED -> {
                        // Elaborazione del cambiamento di batteria
                    }
                    // Altre azioni
                }
            }
        }
    }
    
    override fun onResume() {
        super.onResume()
        val intentFilter = IntentFilter().apply {
            addAction(Intent.ACTION_BATTERY_CHANGED)
            // Altre azioni
        }
        registerReceiver(receiver, intentFilter)
    }
    
    override fun onPause() {
        super.onPause()
        unregisterReceiver(receiver)
    }
    
  2. Registrazione statica:

    • È dichiarata nel file manifest (AndroidManifest.xml).
    • Dura più a lungo del ciclo di vita del componente che l'ha registrata. Può ricevere messaggi anche quando l'applicazione non è attiva (per alcune azioni, con limitazioni nelle ultime versioni di Android).
    • È usata per eventi di sistema che devono essere ricevuti continuamente (ad esempio, all'avvio del dispositivo).
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.example.yourapp">
    
        <application ...>
            <receiver android:name=".MyBroadcastReceiver"
                      android:exported="true"> <!-- Importante per Android 12+ -->
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                    <action android:name="android.intent.action.AIRPLANE_MODE" />
                    <!-- Altre azioni -->
                </intent-filter>
            </receiver>
            ...
        </application>
    </manifest>
    
    // Classe BroadcastReceiver
    class MyBroadcastReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            // Elaborazione del messaggio ricevuto
            intent?.action?.let { action ->
                when (action) {
                    Intent.ACTION_BOOT_COMPLETED -> {
                        // Elaborazione al completamento dell'avvio
                    }
                    Intent.ACTION_AIRPLANE_MODE_CHANGED -> {
                        // Elaborazione del cambiamento di modalità aereo
                    }
                    // Altre azioni
                }
            }
        }
    }