480 Stimmen

Wie verwendet man LocalBroadcastManager?

Verwendung/Standort LocalBroadcastManager wie beschrieben in Google-Dokumente y Dienstsendung doc ?

Ich habe versucht, es zu googeln, aber es gibt keinen Code, mit dem man anfangen könnte?

In den Dokumenten steht, dass ich es verwenden soll, wenn ich die Übertragung intern in den Prozess meiner Anwendung einbinden möchte, aber ich weiß nicht, wo ich danach suchen soll.

Gibt es Hilfe/Kommentar?

更新情報 : Ich weiß, wie man Broadcasts benutzt, aber ich weiß nicht, wie man LocalBroadcastManager in meinem Projekt zur Verfügung.

0 Stimmen

Waqas, haben Sie den Empfänger im Verzeichnis registriert? Wenn ja, lassen Sie mich bitte wissen, wie?

2 Stimmen

Ich glaube nicht, dass Sie einen Empfänger für solche Sendungen im Manifest registrieren müssen, denn wenn Sie das tun, wird dieser Empfänger auch globale Sendungen empfangen.

3 Stimmen

Wahr. Das bedeutet, dass ich den Code wie in der folgenden Antwort beschrieben eingeben muss; LocalBroadcastManager.getInstance(this).registerReceiver(mMe‌​ssageReceiver, new IntentFilter("custom-event-name"));

888voto

Shiki Punkte 16518

Ich werde trotzdem antworten. Nur für den Fall, dass jemand sie braucht.

ReceiverActivity.java

Eine Aktivität, die auf Benachrichtigungen für das Ereignis mit dem Namen "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

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

@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 jedes Mal, wenn die Schaltfläche R.id.button_send angeklickt wird, wird ein Intent gesendet und von mMessageReceiver en ReceiverActivity .

Die Debug-Ausgabe sollte wie folgt 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!

7 Stimmen

Danke. bekam es bereits arbeiten. aber das Problem, das ich konfrontiert war, um auf LocalBroadcastManager-Klasse zu erhalten. Da es sich um eine Support-Paket-Klasse handelt, konnte ich sie nicht in meinem normalen Paket verwenden, bis ich die Kompatibilitätsbibliothek von Android Tools hinzugefügt habe. Sobald es hinzugefügt wurde, ging alles gut. sowieso, danke für die Antwort

200 Stimmen

Bitte beachten Sie, dass onDestroy() wird nicht garantiert angerufen!!! Sie müssen Folgendes verwenden onPause() (denn nur onPause() garantiert ist) und onResume() (denn es ist die Entsprechung für onPause() )

1 Stimmen

@18446744073709551615 Ist es nicht möglich, sich auf onCreate() und Abmeldung bei beiden onDestroy() und weiter onSaveInstanceState() ?

135voto

SohailAziz Punkte 8006

Ich möchte lieber eine umfassende Antwort geben.

  1. LocalbroadcastManager ist in Android 3.0 und höher enthalten, so dass Sie über Support-Bibliothek v4 für frühe Versionen verwenden. siehe Anweisungen aquí

  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 in onResume der Aktivität 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. Empfänger in onPause abmelden:

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

Edit: Die vollständige Anleitung können Sie hier lesen LocalBroadcastManager: Anwendungsinterne Nachrichtenübermittlung

17 Stimmen

+1. Wenn sich Ihr Rundfunkempfänger in einem Fragment befindet, registrieren Sie ihn mit LocalBroadcastManager.getInstance(getActivity()).registerRec‌​eiver(onNotice); und heben Sie diese Registrierung mit LocalBroadcastManager.getInstance(getActivity()).unregisterR‌​eceiver(onNotice);

3 Stimmen

Sind Sie sicher, dass LocalBroadcastManager in Android 3.0 und höher enthalten ist? Ich kann ihn nirgends finden, außer in der Support-Lib

5 Stimmen

Seltsamerweise ist der LBM nur in der Support-Bibliothek enthalten.

47voto

waqas ali Punkte 1228

Auf der Empfängerseite:

  • Erstes Register LocalBroadcast Receiver
  • Dann behandeln Sie eingehende Intent-Daten 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 
              }
          }
      };

Auf der Sendeseite:

   Intent intent = new Intent("filter_string");
   intent.putExtra("key", "My Data");
   // put your all data using put extra 

   LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

0 Stimmen

In meinem Fall nur, wenn ich Aktion in Absicht setzen, wenn Senden Broadcast funktioniert sonst onReceive() Methode nie aufgerufen...

27voto

waqaslam Punkte 66460

In Eclipse musste ich schließlich Folgendes hinzufügen Kompatibilität/Unterstützungsbibliothek indem ich mit der rechten Maustaste auf mein Projekt klicke und wähle:

Android Tools -> Add Support Library

Sobald sie hinzugefügt war, konnte ich die LocalBroadcastManager Klasse in meinem Code.


Android Compatibility Library

21voto

Darish Punkte 10416

Localbroadcastmanager ist veraltet, verwenden Sie stattdessen Implementierungen des Observable-Musters.

androidx.localbroadcastmanager ist in der Version veraltet 1.1.0

Grund

LocalBroadcastManager ist ein anwendungsweiter Ereignisbus und umfasst Schichtverletzungen in Ihrer Anwendung; jede Komponente kann auf Ereignisse von jeder anderen Komponente hören. Es erbt unnötige Anwendungsfallbeschränkungen des Systems BroadcastManager; Entwickler müssen Intent verwenden, auch wenn Objekte nur in einem Prozess leben und diesen nie verlassen. Aus demselben Grund folgt er nicht den Funktionen von BroadcastManager.

Dies alles führt zu einer verwirrenden Erfahrung für Entwickler.

Ersatz

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

Vorteil von LiveData

Sie können eine LiveData Objekt, das das Singleton-Muster verwendet, um Systemdienste so zu verpacken, dass sie in Ihrer Anwendung gemeinsam genutzt werden können. Die LiveData Objekt verbindet sich einmal mit dem Systemdienst, und dann kann jeder Beobachter, der die Ressource benötigt, einfach die LiveData Objekt.

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

Le site observe() Methode übergibt das Fragment, das eine Instanz von LifecycleOwner als erstes Argument. Dies bedeutet, dass dieser Beobachter an den Lifecycle Objekt, das mit dem Eigentümer verbunden ist, bedeutet:

  • Wenn sich das Lifecycle-Objekt nicht in einem aktiven Zustand befindet, dann wird der Beobachter nicht aufgerufen, selbst wenn sich der Wert ändert.

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

Die Tatsache, dass LiveData Die Tatsache, dass Objekte lebenszyklusorientiert sind, bedeutet, dass Sie sie für mehrere Aktivitäten, Fragmente und Dienste freigeben können.

1 Stimmen

Sie haben Recht über undichte Kontexte in die ganze Welt, aber ich würde gerne wissen, was wäre ein geeigneter Ersatz, wenn ich von einem Vordergrunddienst, der auch ohne eine Aktivität ausgeführt wird, kommunizieren wollen, aber wenn Aktivität kommt in, müssen sie kommunizieren?

3 Stimmen

Erstellen Sie eine Singleton-Klasse mit einem LiveData-Objekt und posten Sie Ihre Daten vom Dienst. Sobald die Aktivität startet, kann sie die LiveData ohne Schaden beobachten. z.B: MyServiceData.getInstance().getMyData().observe ...

4 Stimmen

Ich werde LocalBroadcastManager vermissen. Wenn es für die Entwickler bei Google verwirrend war, sollten sie vielleicht aufhören, die Dinge zu übertechnisieren?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X