Diffusion ordonnée Android sendOrderedBroadcast
La diffusion ordonnée se compare à la diffusion non ordonnée (la fonction classique
sendBroadcast). C’est une diffusion transmise sérieusement un par un et c’est une question fréquente aux entretiens techniques.
1. Caractéristiques de la diffusion ordonnée
- Exécution série (transmission linéaire) : Les récepteurs reçoivent la diffusion l’un après l’autre. Le récepteur suivant ne reçoit la diffusion qu’une fois que le précédent a terminé son traitement ; ils ne la reçoivent pas en même temps.
- La diffusion peut être interrompue : Appelez
abortBroadcast()dans la méthodeonReceive()du récepteur pour arrêter la diffusion. Tous les récepteurs suivants ne recevront plus cette diffusion. - La priorité définit l’ordre de réception :
android:priority. Plus la valeur numérique est élevée, plus la priorité est forte et la diffusion est reçue plus tôt.- Plage de valeurs :
-1000 ~ 1000 - Exemple : demo1 avec priority=100, demo2 avec une valeur inférieure. Alors demo1 reçoit en premier, demo2 reçoit ensuite
- Plage de valeurs :
- Les récepteurs peuvent transporter et modifier les données de la diffusion, puis les transmettre au récepteur suivant.
Attention : La diffusion non ordonnée sendBroadcast() ne peut pas être interrompue et n’a pas de priorité. Plusieurs récepteurs reçoivent la diffusion quasiment en même temps
2. Code d’envoi de diffusion ordonnée (Émetteur Demo1)
Intent intent = new Intent("com.foxdevelop.www.senddemo.MY_BROADCAST");
// Envoyer une diffusion ordonnée. Le second paramètre est la permission (null = aucune restriction de permission)
sendOrderedBroadcast(intent, null);
Langage du code : JavaScript (javascript)
3. Récepteur enregistré statiquement, définition de priorité AndroidManifest.xml
<receiver android:name=".MyReceiver">
<!-- priority : plus le nombre est élevé, plus la réception est prioritaire -->
<intent-filter android:priority="100">
<action android:name="com.foxdevelop.www.senddemo.MY_BROADCAST"/>
</intent-filter>
</receiver>
Langage du code : HTML, XML (xml)
Définir une priority inférieure à 100 pour le récepteur dans Demo2, par exemple
android:priority="50". Ordre d’exécution : Récepteur Demo1 → Récepteur Demo2
4. Interrompre la diffusion abortBroadcast()
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Diffusion personnalisée reçue", Toast.LENGTH_LONG).show();
// Interrompre la diffusion ordonnée ! Les récepteurs de priorité inférieure ne recevront plus cette diffusion
abortBroadcast();
}
Langage du code : JavaScript (javascript)
Points clés :
abortBroadcast()ne fonctionne que pour les diffusions ordonnées ; l’appel de cette méthode sur une diffusion non ordonnée classique n’a aucun effet.- Une fois interrompue, la chaîne de transmission de la diffusion s’arrête.
5. Flux complet d’exécution de la diffusion ordonnée
- Demo1 appelle
sendOrderedBroadcastpour envoyer la diffusion - Le système recherche tous les récepteurs correspondant à l’Action, triés par priority décroissante
- Le récepteur de priorité 100 (Récepteur Demo1) reçoit en premier → exécute onReceive
- Si
abortBroadcast()est appelé ici, la diffusion s’arrête immédiatement, Demo2 (priority50) ne reçoit pas la diffusion - Si abortBroadcast n’est pas appelé, la diffusion continue vers le récepteur Demo2
- Si
- Le récepteur Demo2 exécute onReceive
Tableau de comparaison
| Caractéristique | Diffusion non ordonnée sendBroadcast | Diffusion ordonnée sendOrderedBroadcast |
|---|---|---|
| Ordre de réception | Parallèle, reçue presque simultanément, sans ordre | Série, triée selon la priority, priorité élevée reçoit en premier |
| Interruption de diffusion | Impossible d’interrompre, abortBroadcast sans effet | Peut être interrompue par abortBroadcast |
| Transmission des données | Impossible de transmettre des données modifiées au récepteur suivant | Peut modifier les données de l’Intent et les transmettre ensuite |
Diffusion ordonnée