Objets Parcelable et Bundle

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.