Parcelables und Pakete

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.