web-dev-qa-db-de.com

Wie verwende ich LocalBroadcastManager?

Wie verwende ich/ändere LocalBroadcastManager wie in google docs und Service Broadcast doc beschrieben?

Ich habe versucht, es zu googeln, aber es ist kein Code verfügbar, um damit zu beginnen?

Die Dokumente besagen, dass ich es verwenden sollte, wenn ich intern mit meiner App Broadcasting durchführen möchte, aber ich weiß nicht, wo ich danach suchen muss.

Hilfe/Kommentar?

Update: Ich kann Broadcasts verwenden, weiß jedoch nicht, wie LocalBroadcastManager in meinem Projekt verfügbar ist.

400
waqaslam

Ich werde das trotzdem beantworten. Nur für den Fall, dass jemand es braucht. 

ReceiverActivity.Java

Eine Aktivität, die auf Benachrichtigungen für das Ereignis mit dem Namen "custom-event-name" achtet.

@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

Die zweite Aktivität, die Benachrichtigungen sendet/sendet.

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

Mit dem obigen Code wird bei jedem Klicken auf die Schaltfläche R.id.button_send eine Absicht gesendet und von mMessageReceiver in ReceiverActivity empfangen.

Die Debug-Ausgabe sollte folgendermaßen aussehen:

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

Ich möchte lieber umfassend antworten.

  1. LocalbroadcastManager, der in Android 3.0 und höher enthalten ist, damit Sie die Support Library v4 für frühere Versionen verwenden können. siehe Anleitung hier

  2. Erstellen Sie einen Rundfunkempfänger:

    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. Registrieren Sie Ihren Empfänger bei onResume von Aktivitäten wie:

    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 in onPause:

    protected void onPause() {
      super.onPause();
      LocalBroadcastManager.getInstance(this).unregisterReceiver(onNotice);
    }
    
  5. Immer, wenn ein Localbroadcast von der Aktivität oder dem __.-Dienst der Anwendung gesendet wird, wird onReceive von onNotice aufgerufen :).

Bearbeiten: Sie können das vollständige Tutorial hier lesen. LocalBroadcastManager: Intra-Anwendungsnachricht übergeben

124
SohailAziz

am Empfangsende:  

  • Registrieren Sie zuerst den LocalBroadcast-Empfänger
  • Behandeln Sie dann eingehende Absichtsdaten in 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 
              }
          }
      };
    

am Ende der Sendung:

   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

In Eclipse musste ich schließlich Compatibility/Support Library hinzufügen, indem ich mit der rechten Maustaste auf mein Projekt klickte und Folgendes auswählte:

Android Tools -> Add Support Library

Nachdem es hinzugefügt wurde, konnte ich die Klasse LocalBroadcastManager in meinem Code verwenden.


Android Compatibility Library

27
waqaslam

So ändern Sie Ihre globale Übertragung in LocalBroadcast

1) Instanz erstellen

LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);

2) Zur Registrierung von BroadcastReceiver

Ersetzen

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

Mit

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

3) Zum Senden einer Broadcast-Nachricht

Ersetzen

sendBroadcast(intent);

Mit

localBroadcastManager.sendBroadcast(intent);

4) Zur Abmeldung der Broadcast-Nachricht

Ersetzen

unregisterReceiver(mybroadcast);

Mit

localBroadcastManager.unregisterReceiver(mybroadcast);
9
Rohit Singh

Wenn Sie genug mit LocalBroadcastReceiver spielen, schlage ich vor, dass Sie Green Robot's EventBus versuchen - Sie werden definitiv den Unterschied und die Nützlichkeit von LRB erkennen. Weniger Code, anpassbar über den Thread des Empfängers (UI/Bg), das Prüfen der Verfügbarkeit des Empfängers, ständige Ereignisse, Ereignisse können als Datenlieferung verwendet werden.

4
Stan

Ein Beispiel für eine Aktivität und einen Service, die einen LocalBroadcastManager implementieren, finden Sie im Entwickler docs . Ich fand es sehr nützlich.

BEARBEITEN: Der Link wurde seitdem von der Site entfernt. Die Daten lauten jedoch wie folgt: https://github.com/carrot-garden/Android_maven-Android-plugin-samples/blob/master/support4demos /src/com/example/Android/supportv4/content/LocalServiceBroadcaster.Java

2
nindalf

androidx.localbroadcastmanagerwird in Version1.1.0-alpha01 nicht mehr empfohlen.

Grund

LocalBroadcastManager ist ein anwendungsweiter Ereignisbus, der Ebenenverletzungen in Ihrer App umfasst. Jede Komponente kann Ereignisse von einer anderen Komponente abhören. Es erbt unnötige Anwendungsfallbeschränkungen des Systems BroadcastManager. Entwickler müssen Intent verwenden, obwohl Objekte nur in einem Prozess leben und ihn niemals verlassen. Aus demselben Grund folgt der funktionsbezogene BroadcastManager nicht.

Dies führt zu einem verwirrenden Entwicklererlebnis.

Ersatz

Sie können die Verwendung von LocalBroadcastManager durch andere Implementierungen des beobachtbaren Musters ersetzen. Je nach Anwendungsfall können geeignete Optionen LiveData oder reaktive Ströme sein.

Vorteil von LiveData

Sie können ein LiveData-Objekt mithilfe des Singleton-Musters erweitern, um Systemdienste so einzuhüllen, dass sie in Ihrer App freigegeben werden können. Das LiveData-Objekt stellt einmal eine Verbindung zum Systemdienst her, und dann kann jeder Beobachter, der die Ressource benötigt, das LiveData-Objekt einfach überwachen. 

 public class MyFragment extends Fragment {
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        LiveData<BigDecimal> myPriceListener = ...;
        myPriceListener.observe(this, price -> {
            // Update the UI.
        });
    }
}

Die observe()-Methode übergibt das Fragment, das eine Instanz von LifecycleOwner ist, als erstes Argument. Dies bedeutet, dass dieser Beobachter an das mit dem Eigentümer verknüpfte Lifecycle-Objekt gebunden ist.

  • Wenn sich das Lifecycle-Objekt nicht in einem aktiven Status befindet, wird der Beobachter Nicht aufgerufen, auch wenn sich der Wert ändert.

  • Nachdem das Lifecycle-Objekt zerstört wurde, wird der Beobachter automatisch entfernt

Die Tatsache, dass LiveData-Objekte den Lebenszyklus berücksichtigen, bedeutet, dass Sie sie für mehrere Aktivitäten, Fragmente und Services freigeben können.

1
Darish