Broadcast ordenado do Android sendOrderedBroadcast
O broadcast ordenado é comparado ao broadcast desordenado (o método comum
sendBroadcast). Trata-se de um broadcast entregue um a um de forma sequencial e é um tema muito cobrado em entrevistas técnicas.
1. Características do broadcast ordenado
- Execução sequencial (transmissão linear): Os receptores recebem o broadcast um após outro. O próximo receptor só recebe depois que o anterior concluir o processamento; eles não recebem ao mesmo tempo.
- Pode ser interrompido: Ao chamar
abortBroadcast()dentro do métodoonReceive()do receptor, o broadcast é encerrado e todos os receptores seguintes não receberão esse broadcast. - A prioridade define a ordem de recebimento:
android:priority. Quanto maior o valor numérico, maior a prioridade e mais cedo o broadcast é recebido.- Faixa de valores:
-1000 ~ 1000 - Exemplo: demo1 com priority=100, demo2 com valor menor. Nesse caso demo1 recebe primeiro, demo2 recebe depois
- Faixa de valores:
- Os receptores podem carregar, alterar os dados do broadcast e repassar adiante.
Aviso: O broadcast desordenado sendBroadcast() não pode ser interrompido, não tem prioridade e múltiplos receptores recebem quase ao mesmo tempo
2. Código para enviar broadcast ordenado (Remetente Demo1)
Intent intent = new Intent("com.foxdevelop.www.senddemo.MY_BROADCAST");
// Envia broadcast ordenado, o segundo parâmetro é a permissão (null = sem restrição de permissão)
sendOrderedBroadcast(intent, null);
Code language: JavaScript (javascript)
3. Receptor registrado estaticamente, configuração de prioridade AndroidManifest.xml
<receiver android:name=".MyReceiver">
<!-- priority: prioridade, número maior recebe primeiro -->
<intent-filter android:priority="100">
<action android:name="com.foxdevelop.www.senddemo.MY_BROADCAST"/>
</intent-filter>
</receiver>
Code language: HTML, XML (xml)
No receptor do Demo2 definimos uma priority menor que 100, por exemplo
android:priority="50". Ordem de execução: Receptor Demo1 → Receptor Demo2
4. Interromper broadcast abortBroadcast()
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Recebemos nosso broadcast personalizado", Toast.LENGTH_LONG).show();
// Interrompe o broadcast ordenado! Receptores com prioridade menor não receberão esse broadcast
abortBroadcast();
}
Code language: JavaScript (javascript)
Pontos importantes:
abortBroadcast()só funciona para broadcasts ordenados; chamar esse método em um broadcast desordenado comum não surte efeito.- Uma vez interrompido, a cadeia de transmissão do broadcast é finalizada.
5. Fluxo completo de execução do broadcast ordenado
- Demo1 chama
sendOrderedBroadcastpara enviar o broadcast - O sistema busca todos os receptores de broadcast com Action correspondente e os ordena por priority decrescente
- O receptor com prioridade 100 (Receptor Demo1) recebe primeiro → executa onReceive
- Se
abortBroadcast()for chamado aqui, a transmissão para imediatamente, Demo2 (priority50) não recebe o broadcast - Se abortBroadcast não for chamado, o broadcast continua para o receptor Demo2
- Se
- O receptor Demo2 executa onReceive
Tabela de comparação
| Característica | Broadcast desordenado sendBroadcast | Broadcast ordenado sendOrderedBroadcast |
|---|---|---|
| Ordem de recebimento | Paralelo, recebimento quase simultâneo, sem ordem | Sequencial, por priority, maior prioridade recebe primeiro |
| Interrupção do broadcast | Não pode ser interrompido, abortBroadcast sem efeito | Pode ser interrompido com abortBroadcast |
| Transmissão de dados | Não é possível passar dados modificados para o próximo receptor | É possível alterar dados do Intent e repassar adiante |
Broadcast ordenado