Objets Parcelable et Bundle

Les objets Parcelable et Bundle sont destinés à être utilisés au-delà des limites des processus, par exemple avec les transactions IPC/Binder, entre les activités avec des intents, et pour stocker un état temporaire lors des modifications de configuration. Cette page fournit des recommandations et des bonnes pratiques pour utiliser les objets Parcelable et Bundle.

Remarque:Parcel n'est pas un mécanisme de sérialisation à usage général. Vous ne devez jamais stocker de données Parcel sur le disque ni 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é, elle peut transmettre des paramètres à l'aide de la méthode 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 regroupe le Bundle sous-jacent de l'intent. Ensuite, le système d'exploitation crée la nouvelle activité, dissocie les données et transmet l'intent à la nouvelle activité.

Nous vous recommandons d'utiliser la classe Bundle pour définir des primitives connues du système d'exploitation sur des objets Intent. La classe Bundle est hautement optimisée pour le marshaling et le démarshaling à l'aide de parcelles.

Dans certains cas, vous aurez peut-être besoin d'un mécanisme pour envoyer des objets composites ou complexes entre les activités. Dans ce cas, la classe personnalisée doit implémenter Parcelable et fournir la méthode writeToParcel(android.os.Parcel, int) appropriée. Il doit également fournir un champ non nul appelé CREATOR qui implémente l'interface Parcelable.Creator, dont la méthode createFromParcel() permet de reconvertir le Parcel en objet actuel. Pour en savoir plus, consultez la documentation de référence sur l'objet Parcelable.

Lorsque vous envoyez des données via un intent, veillez à limiter la taille des données à quelques Ko. L'envoi d'un trop grand nombre de données peut entraîner la génération d'une exception TransactionTooLargeException par le système.

Envoyer des données entre les processus

L'envoi de données entre les processus est semblable à celui entre les activités. Toutefois, lors de l'envoi d'un processus à un autre, nous vous recommandons de ne pas utiliser de Parcelables personnalisés. Si vous envoyez un objet Parcelable personnalisé d'une application à une autre, vous devez vous assurer que la même version de la classe personnalisée est présente à la fois dans les applications d'envoi et de réception. Il peut s'agir d'une bibliothèque commune utilisée dans les deux applications. Une erreur peut se produire si votre application tente d'envoyer un élément Parcelable personnalisé au système, car celui-ci ne peut pas désimbriquer une classe dont elle n'a pas connaissance.

Par exemple, une application peut définir une alarme à l'aide de la classe AlarmManager et utiliser un Parcelable personnalisé sur l'intent d'alarme. Lorsque l'alarme se déclenche, le système modifie le Bundle d'extras de l'intent pour ajouter un nombre de répétitions. Cette modification peut entraîner la suppression du Parcelable personnalisé des éléments supplémentaires. Cette suppression peut entraîner le plantage de l'application lorsqu'elle reçoit l'intent d'alarme modifié, car l'application s'attend à recevoir des données supplémentaires qui ne sont plus là.

Le tampon de transaction Binder a une taille fixe limitée, actuellement de 1 Mo, qui est partagée par toutes les transactions en cours pour le processus. Étant donné que cette limite est au niveau du processus plutôt qu'au niveau par activité, ces transactions incluent toutes les transactions de liaison dans l'application, telles que onSaveInstanceState, startActivity et toute interaction avec le système. Lorsque la limite de taille est dépassée, une exception TransactionTooLargeException est générée.

Pour le cas spécifique de "savedInstanceState", la quantité de données doit être réduite, car le processus système doit conserver les données fournies aussi longtemps que l'utilisateur peut 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 données.

Remarque:Sous Android 7.0 (niveau d'API 24) ou version ultérieure, le système génère une exception TransactionTooLargeException en tant qu'exception d'exécution. Dans les versions antérieures d'Android, le système n'affiche qu'un avertissement dans logcat.