Parcelable- und Bundle-Objekte sind für die Verwendung über Prozessgrenzen hinweg vorgesehen, z. B. bei IPC-/Binder-Transaktionen, zwischen Aktivitäten mit Intents und zum Speichern des transienten Status bei Konfigurationsänderungen. Auf dieser Seite finden Sie Empfehlungen und Best Practices für die Verwendung von Parcelable- und Bundle-Objekten.
Hinweis:Parcel ist kein Mechanismus für die Serialisierung für allgemeine Zwecke. Sie sollten niemals Parcel-Daten auf der Festplatte speichern oder über das Netzwerk senden.
Daten zwischen Aktivitäten senden
Wenn eine App ein Intent-Objekt erstellt, das in startActivity() verwendet werden soll, um eine neue Aktivität zu starten, kann die App Parameter mit der Methode putExtra() übergeben.
Das folgende Code-Snippet zeigt ein Beispiel dafür, wie Sie diese Operation ausführen.
val intent = Intent(this, MyActivity::class.java).apply { putExtra("media_id", "a1b2c3") // ... } startActivity(intent)
Das Betriebssystem serialisiert das zugrunde liegende Bundle des Intents. Das Betriebssystem erstellt dann die neue Aktivität, entpackt die Daten und übergibt die Absicht an die neue Aktivität.
Wir empfehlen, die Klasse Bundle zu verwenden, um Primitiven, die dem Betriebssystem bekannt sind, für Intent-Objekte festzulegen. Die Klasse Bundle ist für das Marshalling und Unmarshalling mit Parcels optimiert.
In einigen Fällen müssen Sie möglicherweise komplexe Objekte zwischen Aktivitäten übergeben oder im UI-Zustand beibehalten.
In solchen Fällen sollte die benutzerdefinierte Klasse „Parcelable“ implementieren. Für moderne Kotlin- und Jetpack Compose-Apps wird die Verwendung der Annotation @Parcelize empfohlen. Dadurch wird automatisch die Serialisierungslogik generiert, die zum sicheren Umgang mit Ihren Daten bei der Verwendung von Bundles erforderlich ist. Das ist derselbe Ansatz, der für den Umgang mit Ihren Daten bei der Verwendung von rememberSaveable verwendet wird.
Weitere Informationen zur Verwendung von @Parcelize finden Sie unter Parcelable-Implementierungsgenerator.
Wenn Sie Daten über einen Intent senden, sollten Sie darauf achten, dass die Datengröße auf einige KB begrenzt ist.
Wenn zu viele Daten gesendet werden, kann das System eine TransactionTooLargeException-Ausnahme auslösen.
Daten zwischen Prozessen senden
Das Senden von Daten zwischen Prozessen ähnelt dem Senden von Daten zwischen Aktivitäten. Beim Senden zwischen Prozessen empfehlen wir jedoch, keine benutzerdefinierten Parcelables zu verwenden. Wenn Sie ein benutzerdefiniertes Parcelable-Objekt von einer App an eine andere senden, muss in der sendenden und in der empfangenden App genau dieselbe Version der benutzerdefinierten Klasse vorhanden sein. In der Regel ist das eine gemeinsame Bibliothek, die in beiden Apps verwendet wird. Ein Fehler kann auftreten, wenn Ihre App versucht, ein benutzerdefiniertes Parcelable an das System zu senden, da das System eine Klasse, die ihm nicht bekannt ist, nicht entmarshalisieren kann.
Eine App kann beispielsweise mit der Klasse AlarmManager einen Wecker stellen und im Wecker-Intent ein benutzerdefiniertes Parcelable verwenden. Wenn der Wecker klingelt, ändert das System die Extras des Intents Bundle, um eine Wiederholungsanzahl hinzuzufügen. Diese Änderung kann dazu führen, dass das System die benutzerdefinierte Parcelable aus den Extras entfernt. Dieses Entfernen kann wiederum dazu führen, dass die App abstürzt, wenn sie den geänderten Alarm-Intent empfängt, da die App zusätzliche Daten erwartet, die nicht mehr vorhanden sind.
Der Binder-Transaktionspuffer hat eine begrenzte feste Größe, 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 gilt, umfassen diese Transaktionen alle Binder-Transaktionen in der App, z. B. startActivity, rememberSaveable (die onSaveInstanceState im Hintergrund verwendet) und alle Interaktionen mit dem System. Wenn das Größenlimit überschritten wird, wird eine TransactionTooLargeException ausgegeben.
Im konkreten Fall des Speicherns des Status mit rememberSaveable sollte die Datenmenge gering gehalten werden, da der Systemprozess die bereitgestellten Daten so lange aufbewahren muss, wie der Nutzer jemals zu dieser Aktivität zurückkehren kann (auch wenn der Prozess der Aktivität beendet wird).
Wir empfehlen, den gespeicherten Status auf weniger als 50 KB Daten zu beschränken.
Hinweis:In Android 7.0 (API-Level 24) und höher löst das System eine TransactionTooLargeException als Laufzeitfehler aus.
In älteren Android-Versionen wird nur eine Warnung in Logcat angezeigt.