Android – Diffusion locale

Android – Diffusions locales (LocalBroadcastManager)

Rappel important : LocalBroadcastManager est obsolète dans AndroidX. L’utilisation de LiveData ou Flow est recommandée pour la communication au sein d’une application, mais ce sujet reste fréquent en entretien.

1. Qu’est-ce qu’une diffusion locale (comparée aux diffusions globales) ?

Diffusion globale (sendBroadcast / sendOrderedBroadcast vues précédemment)

  • Passe par le système AMS, inter-applications, toutes les apps peuvent recevoir cette diffusion
  • Risque de sécurité : les données peuvent être facilement interceptées par d’autres apps ; d’autres apps peuvent aussi envoyer de fausses diffusions pour attaquer notre app

Diffusion locale — LocalBroadcastManager

  • La diffusion reste dans l’application actuelle et n’utilise pas le mécanisme de diffusion globale du système ; les autres apps ne peuvent rien recevoir ✅ Avantages :
  1. Sécurisée : la diffusion ne fuit pas vers l’extérieur et les apps externes ne peuvent pas en envoyer de fausses
  2. Efficace : pas d’interaction inter-processus ni avec le système AMS, donc plus rapide
  3. Aucune permission requise Limitations :
  4. Enregistrement dynamique uniquement ; l’enregistrement statique (dans AndroidManifest) est invalide
  5. Fonctionne uniquement dans la même app ; impossible de traverser les processus ou apps
  6. Incompatible avec les diffusions système

2. Explication complète du code

2.1 Récepteur personnalisé MyReceiver

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Toast.makeText(context, "Diffusion locale reçue", Toast.LENGTH_LONG).show();
    }
}
Langage du code : PHP (php)

2.2 Utilisation de LocalBroadcastManager dans l’Activity

package cn.bamn.www.localcastdmeo;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private LocalBroadcastManager localBroadcastManager; // Référence au gestionnaire de diffusions locales
    private IntentFilter intentFilter;
    private MyReceiver myReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Obtenir l'instance singleton de LocalBroadcastManager
        localBroadcastManager = LocalBroadcastManager.getInstance(this);

        Button button = (Button) findViewById(R.id.btn_send);
        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                // Construire l'action Intent et envoyer la diffusion locale
                Intent intent = new Intent("com.foxdevelop.www.LocalCastDemo.LOCAL_BROADCAST");
                localBroadcastManager.sendBroadcast(intent);
            }
        });

        // Enregistrer dynamiquement le récepteur de diffusion locale
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.foxdevelop.www.LocalCastDemo.LOCAL_BROADCAST");
        myReceiver = new MyReceiver();
        localBroadcastManager.registerReceiver(myReceiver,intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // Obligatoire : désenregistrer pour éviter les fuites de mémoire
        localBroadcastManager.unregisterReceiver(myReceiver);
    }
}
Langage du code : JavaScript (javascript)

API principales :

  • LocalBroadcastManager.getInstance(context) : obtenir l’instance (singleton)
  • registerReceiver(receiver, intentFilter) : enregistrer dynamiquement un récepteur
  • sendBroadcast(intent) : envoyer une diffusion locale non ordonnée ; sendOrderedBroadcast() pour une diffusion locale ordonnée
  • unregisterReceiver() : désenregistrer à la destruction de la page — obligatoire, source fréquente de fuites de mémoire

3. Comparaison : diffusion locale, diffusion globale non ordonnée, diffusion globale ordonnée

TypePortéeInter-AppPeut être interrompueEnregistrementMécanisme
Diffusion globale non ordonnée sendBroadcastGlobaleOuiImpossible d’interrompreStatique + DynamiqueAMS système inter-processus
Diffusion globale ordonnée sendOrderedBroadcastGlobaleOuiInterrompue par abortBroadcastStatique + DynamiqueAMS système inter-processus, séquentielle selon la priorité
Diffusion locale LocalBroadcastManagerDans l’appNonInterruption possible pour diffusion ordonnéeDynamique uniquementDistribution en mémoire, sans AMS, haute performance

Android – Diffusion locale

Laisser un commentaire

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