Parcelables und Pakete

Die Objekte Parcelable und Bundle sind für die Verwendung über Prozessgrenzen hinweg vorgesehen, z. B. mit IPC/Binder-Transaktionen, zwischen Aktivitäten mit Intents und zum Speichern eines vorübergehenden Status über Konfigurationsänderungen. Auf dieser Seite finden Sie Empfehlungen und Best Practices für die Verwendung von Parcelable- und Bundle-Objekten.

Hinweis: Parcel ist kein universeller Serialisierungsmechanismus. Sie sollten keine Parcel-Daten auf der Festplatte speichern oder über das Netzwerk senden.

Daten zwischen Aktivitäten senden

Wenn eine App ein Intent-Objekt erstellt, das zum Starten einer neuen Aktivität in startActivity(android.content.Intent) verwendet werden soll, kann die App Parameter mit der Methode putExtra(java.lang.String, java.lang.String) übergeben.

Das folgende Code-Snippet zeigt ein Beispiel für die Durchführung dieses Vorgangs.

Kotlin

val intent = Intent(this, MyActivity::class.java).apply {
    putExtra("media_id", "a1b2c3")
    // ...
}
startActivity(intent)

Java

Intent intent = new Intent(this, MyActivity.class);
intent.putExtra("media_id", "a1b2c3");
// ...
startActivity(intent);

Das Betriebssystem packt den zugrunde liegenden Bundle des Intents. Dann erstellt das Betriebssystem die neue Aktivität, entpackt die Daten und übergibt den Intent an die neue Aktivität.

Wir empfehlen, die Klasse Bundle zu verwenden, um für Intent-Objekte Primitive festzulegen, die dem Betriebssystem bekannt sind. Die Klasse Bundle ist hochgradig für Marshalling und Unmarshalling mithilfe von Parzellen optimiert.

In einigen Fällen benötigen Sie möglicherweise einen Mechanismus, um zusammengesetzte oder komplexe Objekte über Aktivitäten hinweg zu senden. In solchen Fällen sollte die benutzerdefinierte Klasse „Paraelable“ implementieren und die entsprechende writeToParcel(android.os.Parcel, int)-Methode bereitstellen. Außerdem muss ein Nicht-Null-Feld namens CREATOR zur Verfügung gestellt werden, das die Parcelable.Creator-Schnittstelle implementiert, deren createFromParcel()-Methode zum Konvertieren des Parcel zurück in das aktuelle Objekt verwendet wird. Weitere Informationen finden Sie in der Referenzdokumentation zum Parcelable-Objekt.

Beim Senden von Daten über einen Intent sollten Sie die Datengröße auf wenige KB beschränken. Wenn zu viele Daten gesendet werden, kann das System die Ausnahme TransactionTooLargeException auslösen.

Daten zwischen Prozessen senden

Das Senden von Daten zwischen Prozessen ähnelt dem zwischen Aktivitäten. Beim Senden zwischen Prozessen empfehlen wir jedoch, keine benutzerdefinierten Parzellen zu verwenden. Wenn Sie ein benutzerdefiniertes Parcelable-Objekt von einer Anwendung an eine andere senden, müssen Sie sicher sein, dass in der sendenden und der empfangenden Anwendung dieselbe Version der benutzerdefinierten Klasse vorhanden ist. In der Regel ist dies eine gemeinsame Bibliothek, die in beiden Anwendungen verwendet wird. Ein Fehler kann auftreten, wenn Ihre Anwendung versucht, eine benutzerdefinierte Parcelable an das System zu senden, da das System eine Klasse, von der es keine Kenntnis hat, nicht aufheben kann.

Eine App kann beispielsweise einen Alarm mithilfe der Klasse AlarmManager festlegen und einen benutzerdefinierten Parcelable für den Alarm-Intent verwenden. Wenn der Alarm ausgelöst wird, ändert das System die Bundle der Extras des Intents, um eine Wiederholungszählung hinzuzufügen. Diese Änderung kann dazu führen, dass das System das benutzerdefinierte Parcelable aus den Extras entfernt. Dieses Entfernen kann wiederum zum Absturz der Anwendung führen, wenn sie den geänderten Alarm-Intent empfängt, da die Anwendung zusätzliche Daten erwartet, die nicht mehr vorhanden sind.

Der Binder-Transaktionspuffer hat eine begrenzte feste Größe von derzeit 1 MB, die von allen laufenden Transaktionen für den Prozess gemeinsam genutzt wird. Da dieses Limit auf Prozessebene und nicht auf Aktivitätsebene liegt, umfassen diese Transaktionen alle Bindertransaktionen in der App, wie onSaveInstanceState, startActivity und alle Interaktionen mit dem System. Wenn das Größenlimit überschritten wird, wird eine TransactionTooLargeException ausgelöst.

Im speziellen Fall von savedInstanceState sollte die Datenmenge klein gehalten werden, da der Systemprozess die bereitgestellten Daten so lange erhalten muss, wie der Nutzer zu dieser Aktivität zurückkehren kann (auch wenn der Prozess der Aktivität beendet ist). Wir empfehlen, den gespeicherten Status auf weniger als 50.000 Daten zu beschränken.

Hinweis: Unter Android 7.0 (API-Level 24) und höher löst das System eine TransactionTooLargeException als Laufzeitausnahme aus. In niedrigeren Android-Versionen zeigt das System nur eine Warnung in Logcat an.