Ich muss einen Verweis auf die Klasse übergeben, die den größten Teil meiner Verarbeitung über ein Bundle ausführt.
Das Problem ist, dass es nichts mit Absichten oder Kontexten zu tun hat und eine große Anzahl nicht-primitiver Objekte enthält. Wie packe ich die Klasse in ein Paket / serialisierbar und übergebe sie an ein startActivityForResult
?
Antworten:
Um herauszufinden, welchen Weg Sie einschlagen müssen, müssen Sie nicht nur die Schlüsselfrage von CommonsWare nach dem "Warum", sondern auch die Frage nach dem "Wozu" beantworten. Passierst du es?
Die Realität ist, dass das einzige, was Bündel durchlaufen kann, einfache Daten sind - alles andere basiert auf Interpretationen dessen, was diese Daten bedeuten oder auf was sie verweisen. Sie können ein Objekt nicht buchstäblich passieren, aber was Sie tun können, ist eines von drei Dingen:
1) Sie können das Objekt in seine konstituierten Daten zerlegen. Wenn das andere Objekt Kenntnis von derselben Art von Objekt hat, kann es aus den serialisierten Daten einen Klon zusammenstellen. So durchlaufen die meisten gängigen Typen Bündel.
2) Sie können einen undurchsichtigen Griff passieren. Wenn Sie es im selben Kontext übergeben (obwohl man sich fragen könnte, warum Sie sich die Mühe machen), ist dies ein Handle, das Sie aufrufen oder dereferenzieren können. Wenn Sie es jedoch über Binder an einen anderen Kontext übergeben, ist der Literalwert eine beliebige Zahl (tatsächlich zählen diese willkürlichen Zahlen vom Start an nacheinander). Sie können nichts anderes tun, als den Überblick zu behalten, bis Sie ihn an den ursprünglichen Kontext zurückgeben, wodurch Binder ihn wieder in den ursprünglichen Handle umwandelt und ihn wieder nützlich macht.
3) Sie können ein magisches Handle übergeben, z. B. einen Dateideskriptor oder einen Verweis auf bestimmte Betriebssystem- / Plattformobjekte. Wenn Sie die richtigen Flags setzen, erstellt Binder einen Klon, der auf dieselbe Ressource für den Empfänger verweist und für die tatsächlich verwendet werden kann das andere Ende. Dies funktioniert jedoch nur für sehr wenige Objekttypen.
Höchstwahrscheinlich übergeben Sie Ihre Klasse entweder nur, damit das andere Ende sie verfolgen und später wiedergeben kann, oder Sie übergeben sie an einen Kontext, in dem ein Klon aus serialisierten Bestandteilen erstellt werden kann ... oder sonst Sie versuchen, etwas zu tun, das einfach nicht funktioniert, und Sie müssen den gesamten Ansatz überdenken.
quelle
Sie können Gson auch verwenden, um ein Objekt in ein JSONObject zu konvertieren und es an ein Bundle weiterzugeben. Für mich war der eleganteste Weg, dies zu tun. Ich habe nicht getestet, wie sich dies auf die Leistung auswirkt.
In der ersten Aktivität
In der nächsten Aktivität
quelle
Die Parcelable- Oberfläche ist eine gute Möglichkeit, ein Objekt mit einer Absicht zu übergeben.
Wie kann ich meine benutzerdefinierten Objekte paketierbar machen? ist eine ziemlich gute Antwort auf die Verwendung von Parcelable
Die offiziellen Google Docs enthalten auch ein Beispiel
quelle
Sie können den globalen Anwendungsstatus verwenden .
Aktualisieren:
Passen Sie dies an und fügen Sie es dann Ihrer AndroidManifest.xml hinzu:
Und dann haben Sie eine Klasse in Ihrem Projekt wie folgt:
Und weil " Es kann über getApplication () von jeder Aktivität oder jedem Dienst aus zugegriffen werden ", verwenden Sie es folgendermaßen:
Hoffentlich hilft das.
quelle
Sie können Ihre Objekte auch serialisierbar machen und die Methoden getSerializable und putSerializable des Bundles verwenden.
quelle
Mögliche Lösung:
Klasse CustomObject:
Unterkundenobjekte:
quelle
Eine weitere Möglichkeit, Objekte über ein Bundle zu senden, ist die Verwendung von
bundle.putByteArray
Beispielcode
Objekt von DataBean in Bundle einfügen:
Konvertieren von Objekten in Byte-Arrays
Objekt vom Bundle zurückholen:
Methode zum Abrufen von Objekten aus Byte-Arrays:
Hoffe das wird anderen Kumpels helfen.
quelle
1. Ein sehr direktes und einfach zu verwendendes Beispiel: Machen Sie das zu übergebende Objekt serialisierbar.
2. Objekt im Bundle übergeben
3.get übergebenes Objekt aus dem Bundle als serialisierbar und dann in Objekt umgewandelt.
quelle
Dies ist eine sehr verspätete Antwort auf meine eigene Frage, aber sie wird immer wieder beachtet, daher muss ich sie ansprechen. Die meisten dieser Antworten sind richtig und erledigen den Job perfekt. Dies hängt jedoch von den Anforderungen der Anwendung ab. Diese Antwort wird verwendet, um zwei Lösungen für dieses Problem zu beschreiben.
Anwendung
Die erste ist die Anwendung , da hier am meisten über die Antwort gesprochen wurde. Die Anwendung ist ein gutes Objekt, um Entitäten zu platzieren, die einen Verweis auf einen Kontext benötigen. Ein "ServerSocket" würde zweifellos einen Kontext benötigen (für Datei-E / A oder einfache "ListAdapter" -Updates). Ich persönlich bevorzuge diese Route. Ich mag Anwendungen, sie sind nützlich für das Abrufen von Kontexten (weil sie statisch gemacht werden können und wahrscheinlich keinen Speicherverlust verursachen) und haben einen einfachen Lebenszyklus.Bedienung
Der Service` ist an zweiter Stelle. Ein "Service" ist eigentlich die bessere Wahl für mein Problem, da genau dafür Services entwickelt wurden: Services sind insofern ordentlich, als sie einen definierten Lebenszyklus haben, der einfacher zu steuern ist. Darüber hinaus können Dienste bei Bedarf extern von der Anwendung ausgeführt werden (dh beim Booten). Dies kann für einige Apps oder nur für eine nette Funktion erforderlich sein.Dies war auch keine vollständige Beschreibung, aber ich habe Links zu den Dokumenten für diejenigen hinterlassen, die mehr untersuchen möchten. Insgesamt
Service
ist das besser für die Instanz, die ich brauchte - ein ServerSocket auf meinem SPP-Gerät ausführen.quelle
Ich bin auf diese Frage gestoßen, als ich nach einer Möglichkeit gesucht habe, ein Date-Objekt zu übergeben. In meinem Fall habe ich, wie in den Antworten vorgeschlagen, Bundle.putSerializable () verwendet, aber das würde für eine komplexe Sache wie den im ursprünglichen Beitrag beschriebenen DataManager nicht funktionieren.
Mein Vorschlag, der ein sehr ähnliches Ergebnis wie das Einfügen des DataManagers in die Anwendung oder das Erstellen eines Singletons liefert, besteht darin, die Abhängigkeitsinjektion zu verwenden, den DataManager an einen Singleton-Bereich zu binden und den DataManager dort einzufügen, wo er benötigt wird. Sie profitieren nicht nur von einer verbesserten Testbarkeit, sondern erhalten auch einen saubereren Code, ohne dass der gesamte Code der Kesselplatte "Abhängigkeiten zwischen Klassen und Aktivitäten weitergeben". (Robo) Guice ist sehr einfach zu bearbeiten und das neue Dolch- Framework sieht ebenfalls vielversprechend aus.
quelle
Eine weitere einfache Möglichkeit, ein Objekt mithilfe eines Bundles zu übergeben:
quelle