Android – Diffusions locales (LocalBroadcastManager)
Rappel important :
LocalBroadcastManagerest obsolète dans AndroidX. L’utilisation deLiveDataouFlowest 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 :
- Sécurisée : la diffusion ne fuit pas vers l’extérieur et les apps externes ne peuvent pas en envoyer de fausses
- Efficace : pas d’interaction inter-processus ni avec le système AMS, donc plus rapide
- Aucune permission requise Limitations :
- Enregistrement dynamique uniquement ; l’enregistrement statique (dans AndroidManifest) est invalide
- Fonctionne uniquement dans la même app ; impossible de traverser les processus ou apps
- 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écepteursendBroadcast(intent): envoyer une diffusion locale non ordonnée ;sendOrderedBroadcast()pour une diffusion locale ordonnéeunregisterReceiver(): 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
| Type | Portée | Inter-App | Peut être interrompue | Enregistrement | Mécanisme |
|---|---|---|---|---|---|
| Diffusion globale non ordonnée sendBroadcast | Globale | Oui | Impossible d’interrompre | Statique + Dynamique | AMS système inter-processus |
| Diffusion globale ordonnée sendOrderedBroadcast | Globale | Oui | Interrompue par abortBroadcast | Statique + Dynamique | AMS système inter-processus, séquentielle selon la priorité |
| Diffusion locale LocalBroadcastManager | Dans l’app | Non | Interruption possible pour diffusion ordonnée | Dynamique uniquement | Distribution en mémoire, sans AMS, haute performance |
Android – Diffusion locale
Previous: Diffusion ordonnée