Broadcast ordenado de Android sendOrderedBroadcast
El broadcast ordenado se compara con el broadcast desordenado (el método común
sendBroadcast). Se trata de un broadcast que se transmite uno tras otro de forma secuencial y es una pregunta muy habitual en entrevistas de trabajo.
1. Características del broadcast ordenado
- Ejecución secuencial (transmisión lineal): Los receptores reciben el broadcast uno por uno en orden. El mensaje solo pasa al siguiente receptor cuando el anterior ha terminado su procesamiento, no los reciben todos al mismo tiempo.
- Se puede interrumpir: Si llamas a
abortBroadcast()dentro del métodoonReceive()del receptor, el broadcast finaliza y todos los receptores que vienen después no recibirán este broadcast. - La prioridad define el orden de recepción:
android:priority. Cuanto mayor sea el valor numérico, mayor será la prioridad y antes recibirá el broadcast.- Rango de valores:
-1000 ~ 1000 - Ejemplo: demo1 tiene priority=100, demo2 usa un valor menor. En ese caso demo1 recibe primero y demo2 después
- Rango de valores:
- Los receptores pueden transportar y modificar los datos del broadcast para enviarlos al siguiente receptor.
Atención: El broadcast desordenado sendBroadcast() no se puede interrumpir, no tiene prioridad y varios receptores lo reciben casi al mismo tiempo
2. Código para enviar un broadcast ordenado (Emisor Demo1)
Intent intent = new Intent("com.foxdevelop.www.senddemo.MY_BROADCAST");
// Enviamos broadcast ordenado, el segundo parámetro es el permiso (null significa sin restricciones de permiso)
sendOrderedBroadcast(intent, null);
Lenguaje del código: JavaScript (javascript)
3. Receptor registrado de forma estática, configuración de prioridad AndroidManifest.xml
<receiver android:name=".MyReceiver">
<!-- priority: prioridad, un número mayor recibe antes el broadcast -->
<intent-filter android:priority="100">
<action android:name="com.foxdevelop.www.senddemo.MY_BROADCAST"/>
</intent-filter>
</receiver>
Lenguaje del código: HTML, XML (xml)
En el receptor de Demo2 configuramos una priority menor que 100, por ejemplo
android:priority="50". Orden de ejecución: Receptor Demo1 → Receptor Demo2
4. Interrumpir broadcast abortBroadcast()
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Hemos recibido nuestro broadcast personalizado", Toast.LENGTH_LONG).show();
// Interrumpimos el broadcast ordenado. Los receptores con menor prioridad posterior no recibirán este mensaje
abortBroadcast();
}
Lenguaje del código: JavaScript (javascript)
Puntos clave:
abortBroadcast()solo funciona en broadcasts ordenados; al llamarlo en un broadcast desordenado normal no tiene efecto.- Una vez interrumpido, la cadena de transmisión del broadcast se detiene.
5. Flujo completo de ejecución del broadcast ordenado
- Demo1 llama a
sendOrderedBroadcastpara emitir el broadcast - El sistema busca todos los receptores de broadcast con Action coincidente y los ordena por priority de mayor a menor
- El receptor con prioridad 100 (Receptor Demo1) recibe primero → ejecuta onReceive
- Si se llama a
abortBroadcast()aquí, se detiene inmediatamente; Demo2 (priority50) no recibe el broadcast - Si no se invoca abortBroadcast, el broadcast continúa hacia el receptor Demo2
- Si se llama a
- El receptor Demo2 ejecuta onReceive
Tabla comparativa
| Característica | Broadcast desordenado sendBroadcast | Broadcast ordenado sendOrderedBroadcast |
|---|---|---|
| Orden de recepción | Paralelo, recepción casi simultánea, sin orden | Secuencial, según priority, mayor prioridad recibe primero |
| Interrupción del broadcast | No se puede interrumpir, abortBroadcast no tiene efecto | Se puede interrumpir llamando a abortBroadcast |
| Transmisión de datos | No se pueden enviar datos modificados al siguiente receptor | Se pueden modificar los datos del Intent y transmitirlos después |
Broadcast ordenado