Implement Parcelable in Android

Es kam der Zeitpunkt, da ich Daten von einer Activity zu einer anderen senden musste. Zuerst schien es kein Problem zu sein Daten in einem Intent zu versenden. Möchte man jedoch ein ganzes Objekt übergeben muss man zwangsläufig Parcelable implementieren.  Einmal gelernt ist es kein Problem, der Weg dahin schien mir jedoch ein wenig steinig, weswegen dieser Artikel entstanden ist.

Daten an Intent übergeben

Möchte man eine weitere Activity starten, so wird bei Android in sogenannter Intent benötigt. Diesen kann man schnell und unkompliziert mittel Intent intent = new Intent();  anlegen. Zum starten einer Activity bietet sich der überladene Konstruktor an, welcher eine Referenz auf die aktuelle Activity erwartet und ein Klassen-Objekt der zu startenden Activity. Angenommen die zu startende Activity heißt MySecondActivity, so änder sich der Code zu:

Daten werden direkt an den Intent mittels der Methode putExtra();  übergeben. Dabei werden 2 Argumente erwartet. Zum einen ein Schlüsselwert, mit welchem das Datum später abgeholt werden kann, zum anderen der eigentliche Wert. putExtra, ist dabei so überladen, dass alle üblichen Standard Typen direkt unterstützt werden. Im folgend Beispiel soll eine ID (int) und eine Textzeile (String) übergeben werden.

Um die Daten in der zweiten Activity zu bekommen geht man wie folgt vor:

 Eigene Objekte übergeben

Offensichtlich kann man Intents nur Basisdatentypen übergeben. Das stimmt mit einer Ausnahme. Android erlaubt das übergeben von Objekten die das Interface Parcelable implementieren. Also zuerst müssen die Wörter implements Parcelable hinter die Klassendeklaration geschrieben werden, womit wir uns verpflichten die Methoden public int describeContents();  und public void writeToParcel(Parcel destination, int flags);  zu implemetieren. Die wichtige Methode hier ist writeToParcel, da hier die eigentliche Arbeit geschieht.

Beispiel

Die folgende Klasse MyData soll jetzt also beispielhaft Parcelable implementieren. Die Klasse hat drei Felder, alle unterschiedlichen Typs:

Im folgenden wird nun Parcelable implementiert:

Wichtig zu beachten ist hierbei die Reihenfolge mit der die Werte eingefügt werden.  Da es keine Schlüsselwerte gibt, ist die Reihenfolge wichtigstes Kriterium um später die korrekten Werte wieder zu finden!

Wollten wird die Klasse in dem jetzigen Zustand übergeben wird sich Android beschweren, dass es keinen Creator gibt. Ein Creator ist ein Feld vom Typ Parcelable.Creator  mit dem Namen CREATOR (groß geschrieben!)

Das Creator Interface zwingt uns erneut 2 Methoden zu implementieren, diese sind jedoch zum Glück nicht sehr umfangreich. Bei genauem hinsehen wird man jedoch feststellen, dass hier ein überladener Konsatrktor verwendet wurde, welcher ein Parcel-Objekt aufnehmen kann und daraus ain MyData-Objekt baut. Dieser Konstruktor muss nun noch erstellt werden:

Objekte des Typs MyData können jetzt wie folgt übergeben werden:

und mittels  MyData data = intent.getParcelableExtra("data");  zurückgeholt werden.

Kommentar verfassen