Les objets Parcelable et Bundle sont conçus pour ê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 l'utilisation des 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() pour démarrer une nouvelle activité, elle peut transmettre des paramètres à l'aide de la méthode putExtra().
L'extrait de code suivant montre comment effectuer cette opération.
val intent = Intent(this, MyActivity::class.java).apply { putExtra("media_id", "a1b2c3") // ... } startActivity(intent)
L'OS répartit le Bundle sous-jacent de l'intention. Le système d'exploitation crée ensuite la nouvelle activité, déserialise les données et transmet l'intent à la nouvelle activité.
Nous vous recommandons d'utiliser la classe Bundle pour définir les primitives connues de l'OS sur les objets Intent. La classe Bundle est fortement optimisée pour la sérialisation et la désérialisation à l'aide de parcels.
Dans certains cas, vous devrez peut-être transmettre des objets complexes entre les activités ou les conserver dans l'état de l'UI.
Dans ce cas, la classe personnalisée doit implémenter Parcelable. Pour les applications Kotlin et Jetpack Compose modernes, l'approche recommandée consiste à utiliser l'annotation @Parcelize. Cela génère automatiquement la logique de sérialisation nécessaire pour gérer vos données de manière sécurisée lorsque vous utilisez des Bundles. Il s'agit de la même approche que celle utilisée pour traiter vos données lorsque vous utilisez rememberSaveable.
Pour en savoir plus sur l'utilisation de @Parcelize, consultez Générateur d'implémentation Parcelable.
Lorsque vous envoyez des données via une intention, veillez à limiter leur taille à quelques Ko.
L'envoi d'une trop grande quantité de données peut entraîner une exception TransactionTooLargeException dans le système.
Envoi de données entre les processus
L'envoi de données entre les processus est semblable à celui entre les activités. Toutefois, lorsque vous envoyez des données entre des processus, 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 version exacte de la classe personnalisée est présente à la fois dans l'application d'envoi et dans l'application 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 objet Parcelable personnalisé au système, car celui-ci ne peut pas désérialiser une classe qu'il ne connaît pas.
Par exemple, une application peut définir une alarme à l'aide de la classe AlarmManager et utiliser un Parcelable personnalisé sur l'intention d'alarme. Lorsque l'alarme se déclenche, le système modifie le Bundle des extras de l'intention pour ajouter un nombre de répétitions. Cette modification peut entraîner la suppression du Parcelable personnalisé des extras par le système. Cette suppression peut entraîner le plantage de l'application lorsqu'elle reçoit l'intent d'alarme modifié, car elle s'attend à recevoir des données supplémentaires qui ne sont plus là.
La taille du tampon de transaction Binder est limitée et fixe (actuellement 1 Mo). Elle est partagée par toutes les transactions en cours pour le processus. Étant donné que cette limite s'applique au niveau du processus plutôt qu'au niveau de chaque activité, ces transactions incluent toutes les transactions de binder dans l'application, telles que startActivity, rememberSaveable (qui utilise onSaveInstanceState en arrière-plan) et toute interaction avec le système. Lorsqu'elle est dépassée, une TransactionTooLargeException est générée.
Dans le cas spécifique de l'enregistrement de l'état avec rememberSaveable, la quantité de données doit être faible, 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 Ko de données.
Remarque : Dans Android 7.0 (niveau d'API 24) et versions ultérieures, 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 qu'un avertissement dans Logcat.