Wie übergebe ich auf Android ein Objekt von einer Aktivität an eine andere? [duplicate]

Lesezeit: 6 Minuten

Wie ubergebe ich auf Android ein Objekt von einer Aktivitat
mtmurdock

Ich muss in der Lage sein, ein Objekt in mehreren Aktivitäten innerhalb meiner App zu verwenden, und es muss das sein gleich Objekt. Was ist der beste Weg, dies zu tun?

Ich habe versucht, das Objekt “öffentlich statisch” zu machen, damit andere Aktivitäten darauf zugreifen können, aber aus irgendeinem Grund schneidet es das einfach nicht. Gibt es eine andere Möglichkeit, dies zu tun?

1646251988 438 Wie ubergebe ich auf Android ein Objekt von einer Aktivitat
Anargund

Wenn Sie ein Absichtsobjekt erstellen, können Sie die folgenden zwei Methoden zum Übergeben von Objekten zwischen zwei Aktivitäten nutzen.

putParcelable

putSerializable

Sie können Ihre Klasse auch implementieren lassen Paketfähig oder Serialisierbar. Dann können Sie Ihre benutzerdefinierten Klassen über Aktivitäten hinweg weitergeben. Ich habe das als sehr nützlich empfunden.

Hier ist ein kleiner Codeausschnitt, den ich verwende

CustomListing currentListing = new CustomListing();
Intent i = new Intent();
Bundle b = new Bundle();
b.putParcelable(Constants.CUSTOM_LISTING, currentListing);
i.putExtras(b);
i.setClass(this, SearchDetailsActivity.class);
startActivity(i);

Und in neu gestartetem Aktivitätscode wird so etwas sein …

Bundle b = this.getIntent().getExtras();
if (b != null)
    mCurrentListing = b.getParcelable(Constants.CUSTOM_LISTING);

  • Ich habe dieses Problem vor Ewigkeiten gelöst, aber ich dachte, Ihre Antwort wäre es wert, akzeptiert zu werden.

    – mtmurdock

    28. Oktober 2011 um 1:40 Uhr

  • Können Sie mir sagen, wie Sie die Parcelable-Methoden implementiert haben? currentListing sollte vom Typ Parcelable sein, richtig?

    – Namratha

    11. Juni 2012 um 8:13 Uhr

  • Natürlich ist es aus meiner eigenen Klasse, es ist keine Standard-Android-Klasse. Alles, was ich sage, ist, eine Konstante als Schlüssel zu verwenden!

    – Anargund

    2. Juli 2012 um 22:39 Uhr

  • Gibt es einen Grund, warum Sie a Bundle als Extra rein i.putExras(b) anstatt einfach die zu setzen Parcelable Objekt direkt über Intent.putExtra(String name,Parcelable value) und dann Abrufen über Intent.getParcelableExtra(String name)?

    – Toni Chan

    2. August 2013 um 22:57 Uhr


  • Ich kann die wärmstens empfehlen Parceler-Bibliothek zur Paketierung von Objekten

    – Bis

    5. Februar 2015 um 10:28 Uhr

Sie können eine Unterklasse von erstellen Anwendung und speichern Sie Ihr gemeinsames Objekt dort. Das Application-Objekt sollte für die Lebensdauer Ihrer App bestehen, solange eine aktive Komponente vorhanden ist.

Aus Ihren Aktivitäten können Sie über auf das Anwendungsobjekt zugreifen getApplication().

  • Ok das ist mir neu. wie würde ich das umsetzen?

    – mtmurdock

    25. Mai 2010 um 19:20 Uhr

  • Am Ende habe ich das Objekt zu einem geschützten Mitglied meiner Startaktivität gemacht und dann direkt von anderen Aktivitäten auf die Variable verwiesen. Das ist nicht gerade Erichs Antwort, aber es war seine Antwort, die mich auf die Idee brachte

    – mtmurdock

    19. Juni 2010 um 4:22 Uhr

  • @TenFour04 Legen Sie es über das Element in Ihrem Manifest fest.

    – Erich Douglas

    11. Februar 2011 um 1:24 Uhr

  • @TenFour04 Das ist lange her und meine Methoden haben sich stark verändert. Ich habe viele Möglichkeiten gefunden, dies zu umgehen. Alles von Singleton-Objekten, auf die über Klassenzugriffsmethoden zugegriffen werden kann, bis hin zur Implementierung der Serializable-Schnittstelle. Anstatt zu versuchen, das Problem zu umgehen, befürwortete ich im Grunde die Methodik von Google. Wenn das betreffende Objekt jedoch im Anwendungsbereich vorhanden sein muss, ist die Antwort von @Erich eine großartige Lösung.

    – mtmurdock

    1. Juni 2011 um 21:39 Uhr

  • Ich denke auch, dass dies eine schlechte Idee ist, da das Anwendungsobjekt mit all seinen lokalen Variablen zerstört wird, wenn der App-Prozess beendet wird. Wenn der Benutzer die App erneut aus dem Stack der letzten Apps öffnen möchte, wird die zuletzt angezeigte Aktivität neu erstellt. Wenn diese Aktivität von zuvor gespeicherten Werten im Anwendungsobjekt abhängt, treten Probleme auf, da diese Werte nicht mehr vorhanden sind. Weitere Informationen finden Sie in diesem Blogbeitrag: Speichern Sie keine Daten im Anwendungsobjekt

    – BrickTop

    3. April 2017 um 14:06 Uhr


1646251989 269 Wie ubergebe ich auf Android ein Objekt von einer Aktivitat
C–

Diese Antwort ist spezifisch für Situationen, in denen die zu übergebenden Objekte eine verschachtelte Klassenstruktur haben. Bei einer verschachtelten Klassenstruktur ist es etwas mühsam, sie parcelable oder serializeable zu machen. Und der Prozess der Serialisierung eines Objekts ist auf Android nicht effizient. Betrachten Sie das folgende Beispiel,

class Myclass    {
  int a;
  class SubClass    {
       int b;
  }
}

Mit Googles GSON-Bibliothek, können Sie ein Objekt direkt in einen JSON-formatierten String parsen und es nach der Verwendung wieder in das Objektformat konvertieren. Zum Beispiel,

MyClass src = new MyClass();
Gson gS = new Gson();
String target = gS.toJson(src); // Converts the object to a JSON String

Jetzt können Sie diesen String als StringExtra mit der Aktivitätsabsicht über Aktivitäten hinweg übergeben.

Intent i = new Intent(FromActivity.this, ToActivity.class);
i.putExtra("MyObjectAsString", target);

Erstellen Sie dann in der empfangenden Aktivität das ursprüngliche Objekt aus der Zeichenfolgendarstellung.

String target = getIntent().getStringExtra("MyObjectAsString");
MyClass src = gS.fromJson(target, MyClass.class); // Converts the JSON String to an Object

Es hält die ursprünglichen Klassen sauber und wiederverwendbar. Vor allem, wenn diese Klassenobjekte als JSON-Objekte aus dem Web erstellt werden, dann ist diese Lösung sehr effizient und zeitsparend.

AKTUALISIEREN


Während die oben erläuterte Methode in den meisten Situationen funktioniert, sollten Sie sich aus offensichtlichen Leistungsgründen nicht auf das gebündelte zusätzliche System von Android verlassen, um Objekte herumzureichen. Es gibt eine Reihe von Lösungen, die diesen Prozess flexibel und effizient machen, hier sind einige. Jedes hat seine eigenen Vor- und Nachteile.

  1. Eventbus
  2. Otto

  • Dies ist die beste Antwort

    – Luttu Android

    18. Januar 2014 um 17:00 Uhr

  • Ist die Serialisierung zu GSON effizient? Ist es schnell genug?

    – osrl

    16. März 2015 um 9:53 Uhr

  • @osrl Für Pojos arbeitet Gson ziemlich schnell. Es wird jedoch empfohlen, eine Event-Bus-Lösung zu verwenden. Bitte beziehen Sie sich auf das Update in der Antwort.

    – C–

    25. August 2015 um 5:00 Uhr

  • Was ist ein vorläufiger Datentyp?

    – Peter Mortensen

    22. November 2015 um 13:41 Uhr

  • @PeterMortensen Macht nichts. Entschuldigung für mein Englisch.

    – C–

    23. November 2015 um 10:55 Uhr

Vielleicht ist es eine unpopuläre Antwort, aber in der Vergangenheit habe ich einfach eine Klasse verwendet, die einen statischen Verweis auf das Objekt hat, das ich durch Aktivitäten beibehalten möchte. Damit,

public class PersonHelper
{
    public static Person person;
}

Ich habe versucht, den Parcelable-Schnittstellenpfad zu durchlaufen, bin aber auf eine Reihe von Problemen gestoßen, und der Overhead in Ihrem Code war für mich unattraktiv.

Dies hängt von der Art der Daten ab, auf die Sie Zugriff benötigen. Wenn Sie eine Art Datenpool haben, der bestehen bleiben muss ActivityDann ist Erichs Antwort der richtige Weg. Wenn Sie nur ein paar Objekte von einer Aktivität an eine andere übergeben müssen, können Sie sie implementieren lassen Serializable und übergeben Sie sie in den Extras der Intent um das Neue zu beginnen Activity.

  • Dies ist wahrscheinlich die beste Lösung, solange Ihre Objekte nicht über die Lebensdauer der Anwendung bestehen bleiben müssen (was in der Antwort von @Erich Douglas enthalten ist).

    – mtmurdock

    1. Juni 2011 um 21:41 Uhr

1646251989 139 Wie ubergebe ich auf Android ein Objekt von einer Aktivitat
Peter Mortensen

Ihr Objekt kann auch die Parcelable-Schnittstelle implementieren. Dann können Sie die verwenden Bundle.putParcelable() -Methode und übergeben Sie Ihr Objekt zwischen Aktivitäten innerhalb der Absicht.

Die Foto-Stream Anwendung verwendet diesen Ansatz und kann als Referenz verwendet werden.

  • Dies ist wahrscheinlich die beste Lösung, solange Ihre Objekte nicht über die Lebensdauer der Anwendung bestehen bleiben müssen (was in der Antwort von @Erich Douglas enthalten ist).

    – mtmurdock

    1. Juni 2011 um 21:41 Uhr

915720cookie-checkWie übergebe ich auf Android ein Objekt von einer Aktivität an eine andere? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy