Comment utiliser / localiser LocalBroadcastManager
comme décrit dans google docs et Service broadcast doc ?
J'ai essayé de le chercher sur Google, mais il n'y a pas de code disponible pour commencer?
Les documents disent que je devrais l'utiliser si je veux faire de la diffusion en interne avec dans le processus de mon application, mais je ne sais pas où chercher.
Une aide / un commentaire?
Mise à jour : je sais comment utiliser les diffusions mais je ne sais pas comment être LocalBroadcastManager
disponible dans mon projet.
android
broadcastreceiver
waqaslam
la source
la source
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("custom-event-name"));
LocalBroadcastManager
est obsolète. J'ai remplacé la mienne par la bibliothèque EventBus qui est beaucoup plus agréable, imo.Réponses:
J'y répondrai quand même. Juste au cas où quelqu'un en aurait besoin.
ReceiverActivity.java
Une activité qui surveille les notifications de l'événement nommé
"custom-event-name"
.SenderActivity.java
La deuxième activité qui envoie / diffuse des notifications.
Avec le code ci-dessus, chaque fois que le bouton
R.id.button_send
est cliqué, une intention est diffusée et reçue parmMessageReceiver
inReceiverActivity
.La sortie de débogage devrait ressembler à ceci:
la source
onDestroy()
n'est pas garanti d'être appelé !!! Vous devez utiliseronPause()
(car seulonPause()
est garanti) etonResume()
(car c'est le match pouronPause()
)onDestroy()
n'est pas un problème. Le cas où elle n'est pas appelée, c'est quand l'application est tuée, et peu importe si vous ne vous désinscrivez pas dans ce cas, car même la liste des récepteurs enregistrés ne survit pas.Je préfère répondre de manière globale.
LocalbroadcastManager inclus dans Android 3.0 et supérieur, vous devez donc utiliser la bibliothèque de support v4 pour les premières versions. voir les instructions ici
Créez un récepteur de diffusion:
Enregistrez votre récepteur sur une reprise d'activité comme:
désenregistrer le récepteur en onPause:
Désormais, chaque fois qu'une diffusion locale est envoyée à partir de l'activité ou du service des applications, onReceive de onNotice sera appelé :).
Edit: Vous pouvez lire le tutoriel complet ici LocalBroadcastManager: passage de message intra application
la source
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(onNotice);
et désenregistrez-le en utilisantLocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(onNotice);
onStop
car dans Android API 24+ avec «Multi-Window / Split-View» (activé par défaut sur l'API 26+ affaicr), l'activité qui n'est pas interagie est en état de pause. Source: developer.android.com/guide/topics/ui/…À la réception:
Ensuite, gérez les données d'intention entrantes dans onReceive.
À la fin de l'envoi:
la source
Dans Eclipse, j'ai finalement dû ajouter la bibliothèque de compatibilité / support en cliquant avec le bouton droit sur mon projet et en sélectionnant:
Une fois qu'il a été ajouté, j'ai pu utiliser la
LocalBroadcastManager
classe dans mon code.la source
localbroadcastmanager est obsolète, utilisez plutôt des implémentations du modèle observable.
androidx.localbroadcastmanager
est déconseillé dans la version 1.1.0Raison
LocalBroadcastManager
est un bus d'événements à l'échelle de l'application et intègre les violations de couche dans votre application; tout composant peut écouter les événements de tout autre composant. Il hérite des limitations inutiles de cas d'utilisation du système BroadcastManager; les développeurs doivent utiliser Intent même si les objets vivent dans un seul processus et ne le quittent jamais. Pour cette même raison, il ne suit pas BroadcastManager en termes de fonctionnalités.Ceux-ci s'ajoutent à une expérience de développeur déroutante.
Remplacement
Vous pouvez remplacer l'utilisation de
LocalBroadcastManager
par d'autres implémentations du modèle observable. Selon votre cas d'utilisation, des options appropriées peuvent êtreLiveData
des flux réactifs.Avantage de LiveData
Vous pouvez étendre un
LiveData
objet à l'aide du modèle singleton pour envelopper les services système afin qu'ils puissent être partagés dans votre application. L'LiveData
objet se connecte au service système une fois, puis tout observateur qui a besoin de la ressource peut simplement regarder l'LiveData
objet.La
observe()
méthode passe le fragment, qui est une instance deLifecycleOwner
, comme premier argument. Cela signifie que cet observateur est lié à l'Lifecycle
objet associé au propriétaire, ce qui signifie:Si l'objet Cycle de vie n'est pas dans un état actif, l'observateur n'est pas appelé même si la valeur change.
Une fois l'objet Cycle de vie détruit, l'observateur est automatiquement supprimé
Le fait que les
LiveData
objets soient sensibles au cycle de vie signifie que vous pouvez les partager entre plusieurs activités, fragments et services.la source
Comment changer votre diffusion mondiale en LocalBroadcast
1) Créer une instance
2) Pour enregistrer BroadcastReceiver
3) Pour l'envoi d'un message diffusé
4) Pour désenregistrer un message diffusé
la source
Lorsque vous jouerez suffisamment avec LocalBroadcastReceiver, je vous suggérerai d' essayer l'EventBus de Green Robot - vous en comprendrez certainement la différence et l'utilité par rapport à LBR. Moins de code, personnalisable sur le thread du récepteur (UI / Bg), vérifiant la disponibilité des récepteurs, les événements collants, les événements peuvent être utilisés comme livraison de données, etc.
la source
Un exemple d'activité et de service implémentant un LocalBroadcastManager peut être trouvé dans les documents du développeur . Je l'ai personnellement trouvé très utile.
EDIT: Le lien a depuis été supprimé du site, mais les données sont les suivantes: https://github.com/carrot-garden/android_maven-android-plugin-samples/blob/master/support4demos/src/com/ exemple / android / supportv4 / content / LocalServiceBroadcaster.java
la source
la source
En en déclarant un dans votre fichier AndroidManifest.xml avec la balise (également appelée statique)
Vous remarquerez que le récepteur de diffusion déclaré ci-dessus a une propriété de exports = "true". Cet attribut indique au récepteur qu'il peut recevoir des émissions de l'extérieur de la portée de l'application.
2. Ou dynamiquement en enregistrant une instance avec registerReceiver (ce que l'on appelle le contexte enregistré)
Il existe trois façons d'envoyer des diffusions:
La méthode sendOrderedBroadcast garantit l'envoi des diffusions à un seul récepteur à la fois. Chaque diffusion peut à son tour, transmettre des données à celle qui la suit, ou arrêter la propagation de la diffusion aux récepteurs qui suivent.
Le sendBroadcast est similaire à la méthode mentionnée ci-dessus, avec une différence. Tous les récepteurs de diffusion reçoivent le message et ne dépendent pas les uns des autres.
La méthode LocalBroadcastManager.sendBroadcast envoie uniquement des diffusions aux récepteurs définis dans votre application et ne dépasse pas la portée de votre application.
la source
nous pouvons également utiliser l'interface pour le même que broadcastManger ici, je partage le code testd pour broadcastManager mais par interface.
faire d'abord une interface comme:
2-c'est la première classe à implémenter
3-voici la deuxième classe qui implémente la même interface dont la méthode appelle automatiquement
donc par cette approche, nous pouvons utiliser l'interface fonctionnant de la même manière que broadcastManager.
la source