932 Stimmen

Wie sendet man ein Objekt von einer Android-Aktivität zu einer anderen mit Intents?

Wie kann ich ein Objekt eines benutzerdefinierten Typs von einem Tätigkeit zu einem anderen unter Verwendung der putExtra() Methode der Klasse Absicht ?

0 Stimmen

@UMMA - Sie brauchen Ihre Fragen nicht ständig als "Community Wiki" zu markieren. Schauen Sie hier nach: meta.stackexchange.com/questions/11740/

1 Stimmen

@Paresh: Der von Ihnen angegebene Link ist defekt. Könnten Sie bitte eine Alternative angeben?

0 Stimmen

802voto

Jeremy Logan Punkte 46499

Wenn Sie nur Objekte weitergeben, dann Paketfähig wurde für diesen Zweck entwickelt. Es erfordert ein wenig mehr Aufwand als die Verwendung der nativen Java-Serialisierung, aber es ist viel schneller (und ich meine viel, WEG schneller).

Ein einfaches Beispiel für die Implementierung findet sich in den Dokumenten:

// simple class that just has one member property as an example
public class MyParcelable implements Parcelable {
    private int mData;

    /* everything below here is for implementing Parcelable */

    // 99.9% of the time you can just ignore this
    @Override
    public int describeContents() {
        return 0;
    }

    // write your object's data to the passed-in Parcel
    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(mData);
    }

    // this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methods
    public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() {
        public MyParcelable createFromParcel(Parcel in) {
            return new MyParcelable(in);
        }

        public MyParcelable[] newArray(int size) {
            return new MyParcelable[size];
        }
    };

    // example constructor that takes a Parcel and gives you an object populated with it's values
    private MyParcelable(Parcel in) {
        mData = in.readInt();
    }
}

Wenn Sie mehr als ein Feld aus einem bestimmten Paket abrufen möchten, müssen Sie dies in der gleichen Reihenfolge tun, in der Sie sie eingegeben haben (d. h. nach dem FIFO-Prinzip).

Sobald Sie Ihre Objekte implementiert haben Parcelable Sie müssen sie nur noch in Ihr System einbauen. Beabsichtigt con putExtra() :

Intent i = new Intent();
i.putExtra("name_of_extra", myParcelableObject);

Dann können Sie sie mit getParcelableExtra() :

Intent i = getIntent();
MyParcelable myParcelableObject = (MyParcelable) i.getParcelableExtra("name_of_extra");

Wenn Ihre Objektklasse Parcelable und Serializable implementiert, dann stellen Sie sicher, dass Sie eine der folgenden Möglichkeiten nutzen:

i.putExtra("parcelable_extra", (Parcelable) myParcelableObject);
i.putExtra("serializable_extra", (Serializable) myParcelableObject);

15 Stimmen

Wie würde dies implementiert werden, wenn mData ein Objekt (z. B. JSONObject) und nicht ein int ist?

0 Stimmen

Parcel verfügt über weitere Methoden zum Schreiben von Datentypen wie Strings. Im Falle eines JSONObjects könnten Sie es in JSON zurückverwandeln und als String schreiben. Wenn das Objekt serialisierbar ist und Sie keinen Zugriff haben, um es parcelbar zu machen, könnten Sie es vielleicht serialisieren und deserialisieren, wenn Sie das Top-Level-Objekt entparzellieren? Ich habe das noch nicht gemacht, nur eine Vermutung.

326 Stimmen

Warum kann man das Objekt nicht einfach ohne all dies übergeben? Wir wollen ein Objekt übergeben, das sich bereits im Speicher befindet.

209voto

David Hedlund Punkte 125085

Sie müssen Ihr Objekt in eine Art von String-Darstellung serialisieren. Eine mögliche String-Darstellung ist JSON, und einer der einfachsten Wege, um in/aus JSON in Android zu serialisieren, ist, wenn Sie mich fragen, durch Google GSON .

In diesem Fall setzen Sie einfach den String-Rückgabewert von (new Gson()).toJson(myObject); und rufen Sie den String-Wert ab und verwenden Sie fromJson um es wieder in Ihr Objekt zu verwandeln.

Wenn Ihr Objekt jedoch nicht sehr komplex ist, lohnt sich dieser Aufwand möglicherweise nicht, und Sie könnten stattdessen die einzelnen Werte des Objekts übergeben.

19 Stimmen

Ich vermute, weil fiXedds Antwort das gleiche Problem ohne die Verwendung externer Bibliotheken löst, und zwar auf eine Weise, die einfach so viel besser ist, dass niemand einen Grund haben sollte, sich an die von mir angebotene Lösung zu halten (ohne zu diesem Zeitpunkt von fiXedds brillanter Lösung zu wissen)

5 Stimmen

Ich denke, das ist richtig. Außerdem ist JSON ein Protokoll, das eher für Client/Server und nicht für Thread-to-Thread geeignet ist.

18 Stimmen

Nicht unbedingt eine schlechte Idee, zumal Gson viel einfacher zu verwenden ist, als parcelable für alle Objekte zu implementieren, die Sie senden möchten.

169voto

Sridhar Punkte 2168

Sie können serialisierbare Objekte durch intent

// send where details is object
ClassName details = new ClassName();
Intent i = new Intent(context, EditActivity.class);
i.putExtra("Editing", details);
startActivity(i);

//receive
ClassName model = (ClassName) getIntent().getSerializableExtra("Editing");

And 

Class ClassName implements Serializable {
}

2 Stimmen

Können Sie auch Parcelable-Objekte mit Hilfe von intent versenden.

6 Stimmen

"Serializable ist auf Android komisch langsam. In vielen Fällen ist sie sogar völlig nutzlos." siehe stackoverflow.com/questions/5550670/

0 Stimmen

Was ist, wenn die Aktivität bereits läuft, ist es notwendig, startActivity(i); zu tun? Ich meine, kann ich die Tätigkeit A aufrufen Tätigkeit B und der die Daten an Tätigkeit A ? bin ich verwirrt ?

71voto

Peter Ajtai Punkte 55551

Für Situationen, in denen Sie wissen, dass Sie Daten innerhalb einer Anwendung weitergeben werden, verwenden Sie "Globals" (wie statische Klassen)

Hier ist was Dianne Hackborn (hackbod - ein Google Android Software Engineer) zu diesem Thema zu sagen hatte:

Für Situationen, in denen Sie wissen, dass die Aktivitäten im selben Prozess ablaufen, können Sie Daten einfach über Globals austauschen. Zum Beispiel können Sie könnte eine globale HashMap<String, WeakReference<MyInterpreterState>> und wenn Sie einen neuen MyInterpreterState erstellen, geben Sie ihm einen eindeutigen Namen und fügen ihn in die Hash-Map ein; um diesen Zustand an einen anderen Aktivität zu senden, setzen Sie einfach den eindeutigen Namen in die Hash-Map, und wenn die zweite Aktivität gestartet wird, kann sie den MyInterpreterState aus der der Hash-Map mit dem erhaltenen Namen abrufen.

26 Stimmen

Ja, ich fand es seltsam, dass uns diese Intents zur Verfügung gestellt werden, und dann sagt uns ein Top-Ingenieur, wir sollen einfach Globals für unsere Daten verwenden. Aber da kommt es direkt aus dem Mund des Pferdes.

1 Stimmen

Wäre eine schwache Referenz hier nicht ein Opfer der Garbage Collection?

1 Stimmen

@uLYsseus denke, das ist die Idee, sobald Sie mit ihnen in den Aktivitäten fertig sind... so, wenn die relevanten Aktivitäten zerstört werden, wird es erlauben, es zu gc

53voto

Pedro Romão Punkte 2135

Ihre Klasse sollte Serializable oder Parcelable implementieren.

public class MY_CLASS implements Serializable

Sobald dies geschehen ist, können Sie ein Objekt an putExtra senden

intent.putExtra("KEY", MY_CLASS_instance);

startActivity(intent);

Um Extras zu erhalten, müssen Sie nur Folgendes tun

Intent intent = getIntent();
MY_CLASS class = (MY_CLASS) intent.getExtras().getSerializable("KEY");

Wenn Ihre Klasse Parcelable implementiert, verwenden Sie next

MY_CLASS class = (MY_CLASS) intent.getExtras().getParcelable("KEY");

Ich hoffe, es hilft :D

8 Stimmen

Ihre Klasse muss implementieren Serializable ist falsch. Die Klasse kann implementieren Parcelable zum Beispiel.

0 Stimmen

Was sind die Unterschiede zwischen Parcelable und Serializable @Kernald ? in Bezug auf die Verarbeitungszeit ist es langsamer / nicht Best Practice oder etwas?

0 Stimmen

Während Serializable ist eine Standard-Java-Schnittstelle, Parcelable ist Android-spezifisch. In Bezug auf die Leistung ist Parcelable effizienter: developerphil.com/parcelable-vs-serializable

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