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.