web-dev-qa-db-fra.com

Comment utiliser LocalBroadcastManager?

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.

400
waqaslam

Je vais répondre à cela quand même. Juste au cas où quelqu'un en aurait besoin. 

ReceiverActivity.Java

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();
}

SenderActivity.Java

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! 
793
Shiki

J'aimerais plutôt répondre de manière complète.

  1. 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

  2. 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 !");
    
        }
    };
    
  3. 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.
    
  4. unRegister receiver in onPause:

    protected void onPause() {
      super.onPause();
      LocalBroadcastManager.getInstance(this).unregisterReceiver(onNotice);
    }
    
  5. 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

124
SohailAziz

En réception:  

  • Premier enregistrement LocalBroadcast Receiver
  • 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);
31
waqas ali

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.


Android Compatibility Library

27
waqaslam

Comment changer votre diffusion globale en LocalBroadcast

1) Créer une instance

LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);

2) Pour enregistrer BroadcastReceiver

Remplacer

registerReceiver(new YourReceiver(),new IntentFilter("YourAction"));

Avec

localBroadcastManager.registerReceiver(new YourReceiver(),new IntentFilter("YourAction"));

3) Pour envoyer un message diffusé

Remplacer

sendBroadcast(intent);

Avec

localBroadcastManager.sendBroadcast(intent);

4) Pour annuler l'enregistrement d'un message diffusé

Remplacer

unregisterReceiver(mybroadcast);

Avec

localBroadcastManager.unregisterReceiver(mybroadcast);
9
Rohit Singh

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.

4
Stan

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

2
nindalf

androidx.localbroadcastmanagerest 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.

1
Darish