Während ich eine iPhone-Anwendung auf Android portiere, suche ich nach dem besten Weg, um innerhalb der App zu kommunizieren. Absichten scheinen der richtige Weg zu sein. Ist dies die beste (einzige) Option? NSUserDefaults scheint sowohl in Bezug auf die Leistung als auch in Bezug auf die Codierung viel leichter zu sein als Intents.
Ich sollte auch hinzufügen, dass ich eine Anwendungsunterklasse für den Status habe, aber ich muss eine andere Aktivität auf ein Ereignis aufmerksam machen.
Antworten:
Sie können dies versuchen: http://developer.android.com/reference/java/util/Observer.html
quelle
Das beste Äquivalent, das ich gefunden habe, ist LocalBroadcastManager, das Teil des Android-Support-Pakets ist .
Aus der LocalBroadcastManager-Dokumentation:
Wenn Sie dies verwenden, können Sie sagen, dass an
Intent
ein Äquivalent zu a istNSNotification
. Hier ist ein Beispiel: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
NSNotificationCenter
, sollte die akzeptierte Antwort sein!Hier ist etwas ähnlich wie bei @Shiki, aber aus der Sicht von iOS-Entwicklern und Notification Center.
Erstellen Sie zunächst eine Art NotificationCenter-Dienst:
Dann benötigen Sie auch einen Aufzählungstyp, um Fehler beim Codieren mit Zeichenfolgen zu vermeiden - (NotificationType):
Hier ist die Verwendung (Hinzufügen / Entfernen von Beobachtern) zum Beispiel in Aktivitäten:
und hier ist schließlich, wie wir Benachrichtigungen an NotificationCenter von einem Rückruf- oder Restdienst oder was auch immer senden:
das war's, Prost!
quelle
Bundle params
anstelle vonHashMap
bequemer ist, um Parameter verschiedener Typen zu übergeben. Es gibt eine schöne Verbindung zwischenIntent
undBundle
:intent.putExtras(params)
Sie könnten dies verwenden: http://developer.android.com/reference/android/content/BroadcastReceiver.html , was ein ähnliches Verhalten ergibt.
Sie können Empfänger programmgesteuert über Context.registerReceiver (BroadcastReceiver, IntentFilter) registrieren und über Context.sendBroadcast (Intent) gesendete Absichten erfassen.
Beachten Sie jedoch, dass ein Empfänger keine Benachrichtigungen erhält, wenn seine Aktivität (sein Kontext) angehalten wurde.
quelle
Ich fand heraus, dass die Verwendung von EventBus von Guava lib der einfachste Weg für die Kommunikation zwischen Komponenten im Publish-Subscribe-Stil ist, ohne dass sich die Komponenten explizit untereinander registrieren müssen
Das Beispiel finden Sie unter https://code.google.com/p/guava-libraries/wiki/EventBusExplained
Sie können diese Bibliothek einfach in Android Studio hinzufügen, indem Sie Ihrem build.gradle eine Abhängigkeit hinzufügen:
quelle
Kotlin : Hier ist eine @ Shiki-Version in Kotlin mit einem kleinen Refactor in einem Fragment.
Fragment.kt
Benachrichtigung überall posten. Nur du brauchst den Kontext.
PS :
activity
(manchmalnull
) verwenden oderconext
mögen, was ich verwendet habe.quelle
Sie könnten schwache Referenzen verwenden.
Auf diese Weise können Sie den Speicher selbst verwalten und Beobachter nach Belieben hinzufügen und entfernen.
Wenn SieObserver hinzufügen, fügen Sie diese Parameter hinzu - wandeln Sie diesen Kontext aus der Aktivität, in die Sie ihn einfügen, in die leere Schnittstelle um, fügen Sie einen Benachrichtigungsnamen hinzu und rufen Sie die Methode zum Ausführen der Schnittstelle auf.
Die Methode zum Ausführen der Schnittstelle verfügt über eine Funktion namens run, um die Daten zurückzugeben, die Sie so etwas übergeben
Erstellen Sie eine Beobachtungsklasse, die eine Referenz mit einer leeren Schnittstelle aufruft. Erstellen Sie Ihre Themethodtorun-Schnittstelle auch aus dem Kontext, der im Addobserver übergeben wird.
Fügen Sie die Beobachtung einer Datenstruktur hinzu.
Um es aufzurufen, ist es dieselbe Methode. Sie müssen jedoch nur den spezifischen Benachrichtigungsnamen in der Datenstruktur finden und die Datei Themethodtorun.run (Benachrichtigungsname, Daten) verwenden.
Dadurch wird ein Rückruf an die Stelle gesendet, an der Sie einen Beobachter mit einem bestimmten Benachrichtigungsnamen erstellt haben. Vergessen Sie nicht, sie zu entfernen, wenn Sie fertig sind!
Dies ist eine gute Referenz für schwache Referenzen.
http://learningviacode.blogspot.co.nz/2014/02/weak-references-in-java.html
Ich bin gerade dabei, diesen Code auf github hochzuladen. Augen offen halten!
quelle