Diffusion ordonnée

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

  1. 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.
  2. La diffusion peut être interrompue : Appelez abortBroadcast() dans la méthode onReceive() du récepteur pour arrêter la diffusion. Tous les récepteurs suivants ne recevront plus cette diffusion.
  3. 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
  4. 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

  1. Demo1 appelle sendOrderedBroadcast pour envoyer la diffusion
  2. Le système recherche tous les récepteurs correspondant à l’Action, triés par priority décroissante
  3. 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
  4. Le récepteur Demo2 exécute onReceive

Tableau de comparaison

CaractéristiqueDiffusion non ordonnée sendBroadcastDiffusion ordonnée sendOrderedBroadcast
Ordre de réceptionParallèle, reçue presque simultanément, sans ordreSérie, triée selon la priority, priorité élevée reçoit en premier
Interruption de diffusionImpossible d’interrompre, abortBroadcast sans effetPeut être interrompue par abortBroadcast
Transmission des donnéesImpossible de transmettre des données modifiées au récepteur suivantPeut modifier les données de l’Intent et les transmettre ensuite

Diffusion ordonnée

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *