Parcelable
- und Bundle
-Objekte sind für Folgendes gedacht:
Über Prozessgrenzen hinweg verwendet, z. B. bei IPC/Binder
Transaktionen zwischen Aktivitäten mit Intents und zum Speichern des Übergangsstatus über die Konfiguration hinweg
Änderungen. Diese Seite enthält Empfehlungen und Best Practices für die Verwendung
Parcelable
- und Bundle
-Objekte.
Hinweis:Parcel
ist kein für allgemeine Zwecke
Serialisierungsmechanismus
Parcel
-Daten auf der Festplatte speichern oder über das Netzwerk senden.
Daten zwischen Aktivitäten senden
Wenn eine App ein Intent
-Objekt zur Verwendung in
startActivity(android.content.Intent)
beim Starten einer neuen Aktivität,
kann die App
Parameter mit dem putExtra(java.lang.String, java.lang.String)
.
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 parst die zugrunde liegende Bundle
des Intents. Dann erstellt das Betriebssystem
der neuen Aktivität,
entpackt die Daten und übergibt den Intent an die neue Aktivität.
Wir empfehlen, die Klasse Bundle
zu verwenden, um Primitive festzulegen, die dem Betriebssystem bekannt sind
Intent
-Objekte. Die Bundle
-Klasse ist stark
für das 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 „Parcelable“ implementieren und die entsprechenden
writeToParcel(android.os.Parcel, int)
-Methode.
Außerdem muss ein Nicht-Null-Feld namens CREATOR
enthalten sein, das
die Parcelable.Creator
-Schnittstelle implementiert, deren
createFromParcel()
wird verwendet, um Parcel
zurück in das aktuelle -Objekt zu konvertieren.
Weitere Informationen
finden Sie in der Referenzdokumentation zum Parcelable
-Objekt.
Wenn Sie Daten über einen Intent senden, sollten Sie die Datengröße auf einige KB beschränken.
Wenn zu viele Daten gesendet werden,
TransactionTooLargeException
Ausnahme.
Daten zwischen Prozessen senden
Das Senden von Daten zwischen Prozessen ähnelt dem zwischen den Aktivitäten. Beim Senden von Nachrichten
zwischen Prozessen wechseln, empfehlen wir, keine benutzerdefinierten Pakete zu verwenden. Wenn Sie eine benutzerdefinierte
Parcelable
-Objekt von einer App in eine andere zu übertragen, müssen Sie sicher sein,
Version der benutzerdefinierten Klasse
sowohl in der sendenden als auch in der empfangenden App vorhanden. Oftmals handelt es sich dabei um eine
gemeinsame Bibliothek,
die in beiden Apps verwendet werden. Ein Fehler kann auftreten, wenn Ihre App versucht, ein benutzerdefiniertes Paket
da es eine Klasse, die es nicht kennt, nicht unmarschieren kann.
Eine App kann z. B. einen Wecker stellen,
die Klasse AlarmManager
und verwenden Sie ein benutzerdefiniertes Parcelable
-Element
auf den Alarm-Intent. Wenn der Alarm ausgelöst wird, ändert das System den Intent
Bundle
von Extras hinzuzufügen
die Anzahl der Wiederholungen. Diese Änderung kann dazu führen, dass die benutzerdefinierten
Parcelable
von den Extras. Diese Art der Entfernung kann wiederum dazu führen,
beim Empfang des geänderten Alarm-Intents abstürzt, da die App erwartet,
zusätzliche Daten empfangen,
die nicht mehr vorhanden sind.
Der Binder-Transaktionszwischenspeicher hat eine begrenzte feste Größe von derzeit 1 MB, die von allen Nutzern gemeinsam genutzt wird. laufenden Transaktionen. Da sich dieses Limit in der statt auf Aktivitätsebene umfassen diese Transaktionen alle Bindertransaktionen in wie onSaveInstanceState und startActivity und jede Interaktion mit dem System. Wenn die Größe -Limit überschritten wird, wird eine TransactionTooLargeException-Ausnahme ausgelöst.
Für den Parameter „SavedInstanceState“ sollte die Datenmenge möglichst gering gehalten werden. da der Systemprozess die bereitgestellten Daten so lange speichern muss, wie die Nutzenden jederzeit zu dieser Aktivität zurückkehren kann (auch wenn der Prozess der Aktivität beendet wird). Wir empfehlen, den gespeicherten Zustand auf weniger als 50.000 Daten zu beschränken.
Hinweis:Unter Android 7.0 (API-Level 24) und höher gibt das System eine Fehlermeldung aus. TransactionTooLargeException als Laufzeitausnahme. Bei älteren Android-Versionen zeigt das System nur eine Warnung im Logcat an.