Les objets Parcelable
et Bundle
sont destinés à être
utilisé dans les limites des processus, comme avec l'IPC/Binder
transactions, entre les activités avec des intents, et pour stocker l'état temporaire dans l'ensemble de la configuration
des modifications. Cette page fournit des recommandations et des bonnes pratiques pour utiliser
Objets Parcelable
et Bundle
.
Remarque:Parcel
n'est pas une application à usage général
mécanisme de sérialisation. Vous ne devez jamais
stocker toutes les données Parcel
sur le disque ou les envoyer sur le réseau.
Envoyer des données entre les activités
Lorsqu'une application crée un objet Intent
à utiliser dans
startActivity(android.content.Intent)
pour démarrer une nouvelle activité,
l'application peut transmettre
à l'aide de l'putExtra(java.lang.String, java.lang.String)
.
L'extrait de code suivant montre comment effectuer cette opération.
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);
L'OS couvre l'Bundle
sous-jacent de l'intent. Ensuite, le système d’exploitation crée
la nouvelle activité,
dépare les données et transmet l'intent à la nouvelle activité.
Nous vous recommandons d'utiliser la classe Bundle
pour définir les primitives connues du système d'exploitation sur
Objets Intent
. La classe Bundle
est très élevée
optimisé pour le marshaling et le désassemblage à l'aide de parcelles.
Dans certains cas, vous aurez peut-être besoin d'un mécanisme pour envoyer des objets composites ou complexes entre des activités.
Dans ce cas, la classe personnalisée doit implémenter Parcelable et fournir la classe
writeToParcel(android.os.Parcel, int)
.
Elle doit également fournir un champ non nul nommé CREATOR
, qui
implémente l'interface Parcelable.Creator
, dont
createFromParcel()
est utilisée pour reconvertir Parcel
en objet actuel.
Pour plus d'informations,
consultez la documentation de référence de l'objet Parcelable
.
Lorsque vous envoyez des données via un intent, vous devez veiller à limiter la taille des données à quelques Ko.
L'envoi d'une trop grande quantité de données peut entraîner la génération
TransactionTooLargeException
exception.
Envoi de données entre les processus
L'envoi de données entre les processus est similaire au processus entre les activités. Toutefois, lors de l'envoi
entre les processus, nous vous recommandons de ne pas utiliser d'éléments parcelables personnalisés. Si vous envoyez un
Parcelable
d'une application à une autre, vous devez vous assurer que
la même version de la classe personnalisée
présentes à la fois sur les applications
d'envoi et de réception. Il peut s'agir d'une bibliothèque classique
utilisées dans les deux applications. Une erreur peut se produire si votre application tente d'envoyer un colis personnalisé à
le système, car il ne peut pas extraire une classe dont il n'a pas connaissance.
Par exemple, une application peut définir une alarme via
la classe AlarmManager
et utiliser une Parcelable
personnalisée ;
sur l'intent d'alarme. Lorsque l'alarme se déclenche, le système modifie
Bundle
d'extras à ajouter
un nombre de répétitions. Cette modification peut entraîner la suppression par le système de la valeur
Parcelable
dans les extras. Cette suppression, à son tour, peut entraîner une
plante lorsqu'elle reçoit l'intent d'alarme modifié, car l'application s'attend à
reçoivent des données supplémentaires
qui n'existent plus.
Le tampon de transaction de liaison a une taille fixe limitée, actuellement de 1 Mo, qui est partagée par tous transactions en cours pour le processus. Cette limite étant en cours de traitement, plutôt qu'au niveau de l'activité, ces transactions incluent toutes les transactions de liaison dans l'application, comme onSaveInstanceState, startActivity et toute interaction avec le système. Lorsque la taille est dépassée, une exception TransactionTooLargeException est générée.
Dans le cas spécifique de savedInstanceState, il convient de limiter la quantité de données. car le processus système doit conserver les données fournies aussi longtemps que l'utilisateur peut jamais revenir à cette activité (même si le processus de l'activité est arrêté). Nous vous recommandons de limiter l'état enregistré à moins de 50 000 de données.
Remarque:Dans Android 7.0 (niveau d'API 24) ou version ultérieure, le système génère une TransactionTooLargeException en tant qu'exception d'exécution. Dans les versions antérieures d'Android, le système n'affiche un avertissement que dans logcat.