Android BroadcastReceiver : gestion événements système
Qu'est-ce qu'un BroadcastReceiver ?
Un BroadcastReceiver est un composant Android qui écoute des Intents broadcast système ou app-définis et exécute une logique brève en réponse. C'est le mécanisme publish-subscribe d'Android.
Sources de broadcast
- Événements système :
BOOT_COMPLETED,BATTERY_LOW,TIMEZONE_CHANGED,CONNECTIVITY_CHANGE,PACKAGE_INSTALLED - Matériel : Branchement casque, bouton camera, événements dock
- Autres apps : Actions custom via
sendBroadcast(),sendOrderedBroadcast()
Enregistrement : Statique vs Dynamique
| Statique (Manifest) | Dynamique (Context.registerReceiver) |
|---|---|
Déclaré dans AndroidManifest.xml | Enregistré dans code (Activity, Service, Application) |
| Toujours actif (même app pas lancé) | Actif seulement tant que contexte enregistreur vit |
| Reçoit broadcasts implicites + explicites | Peut recevoir broadcasts sticky |
| Impact batterie plus fort (réveille app) | Impact moindre, cycle de vie scopé |
Requis pour BOOT_COMPLETED | Préféré pour événements UI |
Le contrat onReceive()
- S'exécute sur thread principal (sauf
goAsync()utilisé) - Doit finir en ~10 secondes (risque ANR)
- Pas d'opérations UI — lancez Activity/Service à la place
- Broadcasts ordonnés : Peut appeler
abortBroadcast(), passer résultat au suivant
Patterns courants
// Enregistrement Manifest <receiver android:name=".BootReceiver" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> // Enregistrement dynamique (dans Activity.onStart()) val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) registerReceiver(networkReceiver, filter) // Dans onStop() unregisterReceiver(networkReceiver)
Alternatives modernes (Android 8+)
- JobScheduler / WorkManager : Exécution différée, garantie avec contraintes (charge, réseau, idle)
- Foreground Service : Tâches longues avec notification visible utilisateur
- LiveData / Flow + Lifecycle : Mises à jour UI réactives au lieu de spaghetti broadcasts
- Broadcasts restreints : Beaucoup broadcasts implicites plus livrés aux receivers Manifest (ex:
CONNECTIVITY_ACTION)
Bonnes pratiques
- Gardez
onReceive() minimal — déléguez à WorkManager/Service - Utilisez
goAsync()pour travail légèrement plus long (encore < ~30s) - Définissez
android:exportedexplicitement (requis API 31+) - Validez action Intent et extras — ne faites pas confiance aveuglément
- Préférez enregistrement dynamique pour événements couplés UI
Résumé
BroadcastReceiver est la colle pour notification événements cross-composant, cross-app, et système-vers-app. Utilisez-le pour déclencheurs brefs ; confiez le vrai travail à WorkManager ou Services.
