Broadcast ordenado

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

  1. 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.
  2. Pode ser interrompido: Ao chamar abortBroadcast() dentro do método onReceive() do receptor, o broadcast é encerrado e todos os receptores seguintes não receberão esse broadcast.
  3. 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
  4. 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

  1. Demo1 chama sendOrderedBroadcast para enviar o broadcast
  2. O sistema busca todos os receptores de broadcast com Action correspondente e os ordena por priority decrescente
  3. 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
  4. O receptor Demo2 executa onReceive

Tabela de comparação

CaracterísticaBroadcast desordenado sendBroadcastBroadcast ordenado sendOrderedBroadcast
Ordem de recebimentoParalelo, recebimento quase simultâneo, sem ordemSequencial, por priority, maior prioridade recebe primeiro
Interrupção do broadcastNão pode ser interrompido, abortBroadcast sem efeitoPode ser interrompido com abortBroadcast
Transmissão de dadosNão é possível passar dados modificados para o próximo receptorÉ possível alterar dados do Intent e repassar adiante

Broadcast ordenado

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *