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)