Comment utiliser/localiser LocalBroadcastManager
comme décrit dans google docs et Service broadcast doc ?
J'ai essayé de google, mais il n'y a pas de code disponible pour commencer?
Les documents disent que je devrais l'utiliser si je veux diffuser en interne avec le processus de mon application, mais je ne sais pas où chercher.
Toute aide/commentaire?
Update: Je sais comment utiliser les émissions, mais je ne sais pas comment obtenir LocalBroadcastManager
disponible dans mon projet.
Je vais répondre à cela quand même. Juste au cas où quelqu'un en aurait besoin.
Une activité qui surveille les notifications pour l'événement nommé "custom-event-name"
.
@Override
public void onCreate(Bundle savedInstanceState) {
...
// Register to receive messages.
// We are registering an observer (mMessageReceiver) to receive Intents
// with actions named "custom-event-name".
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
new IntentFilter("custom-event-name"));
}
// Our handler for received Intents. This will be called whenever an Intent
// with an action named "custom-event-name" is broadcasted.
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Get extra data included in the Intent
String message = intent.getStringExtra("message");
Log.d("receiver", "Got message: " + message);
}
};
@Override
protected void onDestroy() {
// Unregister since the activity is about to be closed.
LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
super.onDestroy();
}
La deuxième activité qui envoie/diffuse des notifications.
@Override
public void onCreate(Bundle savedInstanceState) {
...
// Every time a button is clicked, we want to broadcast a notification.
findViewById(R.id.button_send).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendMessage();
}
});
}
// Send an Intent with an action named "custom-event-name". The Intent sent should
// be received by the ReceiverActivity.
private void sendMessage() {
Log.d("sender", "Broadcasting message");
Intent intent = new Intent("custom-event-name");
// You can also include some extra data.
intent.putExtra("message", "This is my message!");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
Avec le code ci-dessus, chaque fois que le bouton R.id.button_send
est cliqué, une intention est diffusée et est reçue par mMessageReceiver
dans ReceiverActivity
.
La sortie de débogage devrait ressembler à ceci:
01-16 10:35:42.413: D/sender(356): Broadcasting message
01-16 10:35:42.421: D/receiver(356): Got message: This is my message!
J'aimerais plutôt répondre de manière complète.
LocalbroadcastManager inclus dans Android 3.0 et versions ultérieures afin que vous puissiez utiliser la bibliothèque de support technique v4 pour les versions antérieures. voir les instructions ici
Créer un récepteur de diffusion:
private BroadcastReceiver onNotice= new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// intent can contain anydata
Log.d("sohail","onReceive called");
tv.setText("Broadcast received !");
}
};
Enregistrez votre récepteur dans onResume d'activité comme:
protected void onResume() {
super.onResume();
IntentFilter iff= new IntentFilter(MyIntentService.ACTION);
LocalBroadcastManager.getInstance(this).registerReceiver(onNotice, iff);
}
//MyIntentService.ACTION is just a public static string defined in MyIntentService.
unRegister receiver in onPause:
protected void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(this).unregisterReceiver(onNotice);
}
Désormais, chaque fois qu'une émission locale est envoyée à partir de l'activité des applications ou du service , OnReceive de onNotice sera appelée :).
Edit: Vous pouvez lire le didacticiel complet ici LocalBroadcastManager: transmission de messages intra-application
En réception:
Puis gérez les données d’intention entrantes dans onReceive.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
lbm.registerReceiver(receiver, new IntentFilter("filter_string"));
}
public BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null) {
String str = intent.getStringExtra("key");
// get all your data from intent and do what you want
}
}
};
Fin d'envoi:
Intent intent = new Intent("filter_string");
intent.putExtra("key", "My Data");
// put your all data using put extra
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
Dans Eclipse, j'ai finalement dû ajouter Compatibility/Support Library en cliquant avec le bouton droit de la souris sur mon projet et en sélectionnant:
Android Tools -> Add Support Library
Une fois ajouté, j'ai pu utiliser la classe LocalBroadcastManager
dans mon code.
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
Remplacer
registerReceiver(new YourReceiver(),new IntentFilter("YourAction"));
Avec
localBroadcastManager.registerReceiver(new YourReceiver(),new IntentFilter("YourAction"));
Remplacer
sendBroadcast(intent);
Avec
localBroadcastManager.sendBroadcast(intent);
Remplacer
unregisterReceiver(mybroadcast);
Avec
localBroadcastManager.unregisterReceiver(mybroadcast);
Lorsque vous jouerez suffisamment avec LocalBroadcastReceiver, je vous suggère d'essayer essayez l'EventBus de Green Robot à essayer - vous en rendrez certainement compte et son utilité par rapport à LBR. Moins de code, personnalisable sur le fil du destinataire (UI/Bg), la vérification de la disponibilité des destinataires, les événements collants, les événements peuvent être utilisés pour la livraison de données, etc.
Un exemple d'activité et de service implémentant LocalBroadcastManager se trouve dans le développeur docs . J'ai personnellement trouvé cela 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/example/Android/supportv4/content/LocalServiceBroadcaster.Java
androidx.localbroadcastmanager
est obsolète dans la version1.1.0-alpha01
Raison
LocalBroadcastManager
est un bus d'événements à l'échelle de l'application et englobe les violations de couche dans votre application. tout composant peut écouter des événements provenant de tout autre composant . Il hérite des limitations de cas d'utilisation inutiles du système BroadcastManager; Les développeurs doivent utiliser Intent même si les objets ne vivent que dans un processus et ne le quittent jamais. Pour cette même raison, BroadcastManager n’est pas adapté aux fonctionnalités.
Cela ajoute à 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, les options appropriées peuvent être LiveData
ou des flux réactifs.
Avantage de LiveData
Vous pouvez étendre un objet LiveData
à l'aide du modèle singleton pour envelopper les services système afin qu'ils puissent être partagés dans votre application. L'objet LiveData
se connecte une fois au service système, puis tout observateur ayant besoin de la ressource peut simplement regarder l'objet LiveData
.
public class MyFragment extends Fragment {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
LiveData<BigDecimal> myPriceListener = ...;
myPriceListener.observe(this, price -> {
// Update the UI.
});
}
}
La méthode observe()
passe le fragment, qui est une instance de LifecycleOwner
, en tant que premier argument. Cela signifie que cet observateur est lié à l'objet Lifecycle
associé au propriétaire, ce qui signifie:
Si l'objet Lifecycle n'est pas dans un état actif, l'observateur .__ n'est pas appelé, même si la valeur change.
Une fois l'objet Lifecycle détruit, l'observateur est automatiquement supprimé.
Le fait que les objets LiveData
soient sensibles au cycle de vie signifie que vous pouvez les partager entre plusieurs activités, fragments et services.