Wie verwende / finde ichLocalBroadcastManager
wie in Google Docs und Service Broadcast Doc beschrieben ?
Ich habe versucht, es zu googeln, aber es ist zunächst kein Code verfügbar?
Die Dokumente besagen, dass ich es verwenden sollte, wenn ich im Prozess meiner App intern senden möchte, aber ich weiß nicht, wo ich danach suchen soll.
Hilfe / Kommentar?
Update : Ich weiß, wie man Broadcasts verwendet, weiß aber nicht, wie ich LocalBroadcastManager
in meinem Projekt verfügbar werde.
android
broadcastreceiver
Waqaslam
quelle
quelle
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("custom-event-name"));
LocalBroadcastManager
wurde veraltet. Ich habe meine durch die EventBus-Bibliothek ersetzt, die viel schöner ist, imo.Antworten:
Ich werde das trotzdem beantworten. Nur für den Fall, dass jemand es braucht.
ReceiverActivity.java
Eine Aktivität, die nach Benachrichtigungen für das genannte Ereignis sucht
"custom-event-name"
.SenderActivity.java
Die zweite Aktivität, die Benachrichtigungen sendet / sendet.
Mit dem obigen Code wird jedes Mal, wenn auf die Schaltfläche
R.id.button_send
geklickt wird, eine Absicht gesendet und vonmMessageReceiver
in empfangenReceiverActivity
.Die Debug-Ausgabe sollte folgendermaßen aussehen:
quelle
onDestroy()
Anruf nicht garantiert ist !!! Sie müssen verwendenonPause()
(weil nuronPause()
garantiert ist) undonResume()
(weil es das Match für istonPause()
)onDestroy()
es ist kein Problem. Der Fall, in dem es nicht aufgerufen wird, ist, wenn die App beendet wird, und es spielt keine Rolle, ob Sie die Registrierung in diesem Fall nicht aufheben, da nicht einmal die Liste der registrierten Empfänger dies überlebt.Ich möchte lieber umfassend antworten.
LocalbroadcastManager ist in Android 3.0 und höher enthalten, daher müssen Sie die Support-Bibliothek v4 für frühere Versionen verwenden. Anweisungen hier
Erstellen Sie einen Rundfunkempfänger:
Registrieren Sie Ihren Empfänger in onResume of activity wie:
Empfänger in onPause abmelden:
Immer wenn ein lokaler Broadcast von der Aktivität oder dem Dienst der Anwendung gesendet wird, wird onReceive of onNotice aufgerufen :).
Bearbeiten: Sie können das vollständige Tutorial hier lesen. LocalBroadcastManager: Intra Application Message Passing
quelle
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(onNotice);
undLocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(onNotice);
onStop
da in Android API 24+ mit "Multi-Window / Split-View" (standardmäßig aktiviert auf API 26+ affaicr) die Aktivität, mit der nicht interagiert wird, angehalten ist. Quelle: developer.android.com/guide/topics/ui/…Am Empfangsende:
Behandeln Sie dann eingehende Absichtsdaten in onReceive.
Am Sendeende:
quelle
In Eclipse musste ich schließlich die Kompatibilitäts- / Supportbibliothek hinzufügen, indem ich mit der rechten Maustaste auf mein Projekt klickte und Folgendes auswählte:
Sobald es hinzugefügt wurde, konnte ich
LocalBroadcastManager
Klasse in meinem Code verwenden.quelle
So ändern Sie Ihre globale Sendung in LocalBroadcast
1) Instanz erstellen
2) Zur Registrierung von BroadcastReceiver
3) Zum Senden einer Broadcast-Nachricht
4) Zum Aufheben der Registrierung der Broadcast-Nachricht
quelle
localbroadcastmanager ist veraltet. Verwenden Sie stattdessen Implementierungen des beobachtbaren Musters.
androidx.localbroadcastmanager
wird in Version 1.1.0 nicht mehr unterstütztGrund
LocalBroadcastManager
ist ein anwendungsweiter Ereignisbus und berücksichtigt Ebenenverletzungen in Ihrer App. Jede Komponente kann Ereignisse von jeder 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 dem gleichen Grund folgt es nicht dem funktionsweisen BroadcastManager.Dies führt zu einer verwirrenden Entwicklererfahrung.
Ersatz
Sie können die Verwendung von
LocalBroadcastManager
durch andere Implementierungen des beobachtbaren Musters ersetzen. Abhängig von Ihrem Anwendungsfall können geeignete OptionenLiveData
oder reaktive Streams sein.Vorteil von LiveData
Sie können ein
LiveData
Objekt mithilfe des Singleton-Musters erweitern, um Systemdienste so zu verpacken, dass sie in Ihrer App freigegeben werden können. DasLiveData
Objekt stellt einmal eine Verbindung zum Systemdienst her, und dann kann jeder Beobachter, der die Ressource benötigt, dasLiveData
Objekt einfach beobachten .Die
observe()
Methode übergibt das Fragment, bei dem es sich um eine Instanz handeltLifecycleOwner
, als erstes Argument. Dies bedeutet, dass dieser Beobachter an dasLifecycle
dem Eigentümer zugeordnete Objekt gebunden ist , was bedeutet:Wenn sich das Lifecycle-Objekt nicht in einem aktiven Zustand befindet, wird der Beobachter auch dann nicht aufgerufen, wenn sich der Wert ändert.
Nachdem das Lifecycle-Objekt zerstört wurde, wird der Beobachter automatisch entfernt
Die Tatsache, dass
LiveData
Objekte lebenszyklusabhängig sind, bedeutet, dass Sie sie für mehrere Aktivitäten, Fragmente und Dienste freigeben können.quelle
Wenn Sie genug mit LocalBroadcastReceiver spielen, empfehle ich Ihnen, den EventBus von Green Robot auszuprobieren - Sie werden den Unterschied und die Nützlichkeit von EventBus im Vergleich zu LBR auf jeden Fall erkennen. Weniger Code, anpassbar an den Thread des Empfängers (UI / Bg), Überprüfung der Verfügbarkeit des Empfängers, Sticky-Ereignisse, Ereignisse können als Datenübermittlung usw. verwendet werden.
quelle
Ein Beispiel für eine Aktivität und ein Dienst eine LocalBroadcastManager Implementierung in den Entwickler finden docs . Ich persönlich fand es sehr nützlich.
BEARBEITEN: Der Link wurde seitdem von der Website entfernt, aber die Daten lauten wie folgt: https://github.com/carrot-garden/android_maven-android-plugin-samples/blob/master/support4demos/src/com/ Beispiel / android / supportv4 / content / LocalServiceBroadcaster.java
quelle
quelle
Indem Sie eine in Ihrer AndroidManifest.xml-Datei mit dem Tag deklarieren (auch als statisch bezeichnet)
Sie werden feststellen, dass der oben deklarierte Rundfunkempfänger die Eigenschaft exported = "true" hat. Dieses Attribut teilt dem Empfänger mit, dass er Broadcasts von außerhalb des Anwendungsbereichs empfangen kann.
2. Oder dynamisch durch Registrieren einer Instanz bei registerReceiver (sogenannter Kontext registriert)
Es gibt drei Möglichkeiten, Broadcasts zu senden:
Die sendOrderedBroadcast-Methode stellt sicher, dass Broadcasts jeweils nur an einen Empfänger gesendet werden. Jede Sendung kann wiederum Daten an die folgende Sendung weiterleiten oder die Weitergabe der Sendung an die folgenden Empfänger stoppen.
Der sendBroadcast ähnelt der oben genannten Methode, mit einem Unterschied. Alle Rundfunkempfänger empfangen die Nachricht und sind nicht voneinander abhängig.
Die LocalBroadcastManager.sendBroadcast-Methode sendet nur Broadcasts an Empfänger, die in Ihrer Anwendung definiert sind, und überschreitet nicht den Umfang Ihrer Anwendung.
quelle
Wir können hier auch die Schnittstelle für BroadcastManger verwenden. Ich teile den Testcode für BroadcastManager, aber nach Schnittstelle.
Machen Sie zuerst eine Schnittstelle wie:
2-Dies ist die erste Klasse, die implementiert werden muss
3-hier ist die zweite Klasse, die dieselbe Schnittstelle implementiert, deren Methode automatisch aufgerufen wird
Durch diesen Ansatz können wir die Schnittstelle verwenden, die genauso funktioniert wie BroadcastManager.
quelle