Sobes.tech
Junior

Como conectar um BroadcastReceiver para receber mensagens no Android?

sobes.tech IA

Resposta da IA

Existem dois métodos principais:

  1. Registo dinâmico:

    • Regista-se e cancela-se programaticamente no código.
    • Dura enquanto o objeto que o registou estiver ativo.
    • Usado para eventos que não precisam de ser recebidos constantemente ou quando a aplicação não está ativa (por exemplo, ao alterar a orientação, nível de bateria).
    // Em Activity ou Fragment
    private val receiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            // Processamento da mensagem recebida
            intent?.action?.let { action ->
                when (action) {
                    Intent.ACTION_BATTERY_CHANGED -> {
                        // Processamento da alteração da bateria
                    }
                    // Outras ações
                }
            }
        }
    }
    
    override fun onResume() {
        super.onResume()
        val intentFilter = IntentFilter().apply {
            addAction(Intent.ACTION_BATTERY_CHANGED)
            // Outras ações
        }
        registerReceiver(receiver, intentFilter)
    }
    
    override fun onPause() {
        super.onPause()
        unregisterReceiver(receiver)
    }
    
  2. Registo estático:

    • Declarado no ficheiro de manifesto (AndroidManifest.xml).
    • Dura mais do que o ciclo de vida do componente que o registou. Pode receber mensagens mesmo quando a aplicação não está ativa (para algumas ações, com limitações nas últimas versões do Android).
    • Usado para eventos do sistema que precisam de ser recebidos constantemente (por exemplo, ao ligar o dispositivo).
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.example.yourapp">
    
        <application ...>
            <receiver android:name=".MyBroadcastReceiver"
                      android:exported="true"> <!-- Importante para Android 12+ -->
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                    <action android:name="android.intent.action.AIRPLANE_MODE" />
                    <!-- Outras ações -->
                </intent-filter>
            </receiver>
            ...
        </application>
    </manifest>
    
    // Classe BroadcastReceiver
    class MyBroadcastReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            // Processamento da mensagem recebida
            intent?.action?.let { action ->
                when (action) {
                    Intent.ACTION_BOOT_COMPLETED -> {
                        // Processamento ao terminar o arranque
                    }
                    Intent.ACTION_AIRPLANE_MODE_CHANGED -> {
                        // Processamento da alteração do modo avião
                    }
                    // Outras ações
                }
            }
        }
    }