Sobes.tech
Junior

É possível enviar uma mensagem broadcast própria?

sobes.tech IA

Resposta da IA

Sim, é possível.

Utiliza-se o método sendBroadcast().

// Criar um Intent para o nosso broadcast
val intent = Intent("com.example.MY_CUSTOM_ACTION")

// Adicionar dados adicionais ao Intent (opcional)
intent.putExtra("data_key", "some_value")

// Enviar broadcast
sendBroadcast(intent)

Para receber esta mensagem, é necessário registar um BroadcastReceiver.

A registração pode ser estática (no Manifest) ou dinâmica (no código usando registerReceiver).

Exemplo de registração dinâmica:

// Criar um filtro para o nosso broadcast
val filter = IntentFilter("com.example.MY_CUSTOM_ACTION")

// Criar um BroadcastReceiver
val receiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        // Processar a mensagem recebida
        val receivedData = intent?.getStringExtra("data_key")
        Log.d("BroadcastReceiver", "Broadcast personalizado recebido com dados: $receivedData")
    }
}

// Registar o BroadcastReceiver
registerReceiver(receiver, filter)

// Não esquecer de cancelar a registração ao destruir o componente
// unregisterReceiver(receiver)

É importante ter em conta os seguintes aspetos:

  • Mensagens broadcast explícitas: Android 8.0 (nível API 26) e superiores introduziram restrições nos broadcasts implícitos para otimizar o consumo de recursos. Para enviar estas mensagens em versões mais recentes do Android, muitas vezes é necessário especificar o pacote do receptor (broadcast explícito).
    val intent = Intent("com.example.MY_CUSTOM_ACTION")
    // Especificar o pacote do receptor (se conhecido)
    intent.setPackage("com.example.receiverapp")
    sendBroadcast(intent)
    
  • Permissões: Para enviar e receber broadcasts com certos níveis de proteção (por exemplo, android.permission.SEND_SMS), podem ser necessárias permissões apropriadas.
  • Mensagens broadcast locais: Para transmitir mensagens apenas dentro de uma mesma aplicação, recomenda-se usar LocalBroadcastManager (agora obsoleto, recomenda-se usar outras abordagens como Flow ou RxJava), que é mais eficiente e seguro.
    // Enviar um broadcast local
    val localIntent = Intent("com.example.MY_LOCAL_ACTION")
    LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent)
    
    // Registar um BroadcastReceiver local
    val localReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            // Processar
        }
    }
    LocalBroadcastManager.getInstance(this).registerReceiver(localReceiver, IntentFilter("com.example.MY_LOCAL_ACTION"))
    
    // Cancelar o registo
    // LocalBroadcastManager.getInstance(this).unregisterReceiver(localReceiver)