293 votes

Qu'est-ce qu'un "bundle" dans une application Android ?

Qu'est-ce qu'un bundle dans une application Android ? Quand l'utiliser ?

297voto

samtherock Points 808

Les bundles sont généralement utilisés pour transmettre des données entre différentes activités Android. Cela dépend de vous quel type de valeurs vous voulez transmettre, mais les bundles peuvent contenir tous types de valeurs et les transmettre à la nouvelle activité.

Vous pouvez l'utiliser comme ceci :

Intent intent = new...
Intent(getApplicationContext(), SecondActivity.class);
intent.putExtra("myKey", AnyValue);  
startActivity(intent);

Vous pouvez récupérer les valeurs transmises en faisant :

Bundle extras = intent.getExtras(); 
String tmp = extras.getString("myKey");

Vous pouvez trouver plus d'informations sur :

3 votes

Pourquoi ne pas simplement utiliser directement System.object et caster ?

0 votes

Passer "AnyValue" et procéder à supposer que la valeur est une chaîne de caractères?

93voto

mahalakshmi Points 121

Transférer des données entre les activités en utilisant les objets Bundle et Intent.


Tout d'abord, créez un objet Bundle

Bundle b = new Bundle();

Ensuite, associez les données de chaîne stockées dans anystring à la clé du bundle "myname"

b.putString("myname", anystring);

Créez maintenant un objet Intent

Intent in = new Intent(getApplicationContext(), secondActivity.class);

Transférez l'objet bundle b à l'intent

in.putExtras(b);

et démarrez la deuxième activité

startActivity(in);

Dans la deuxième activité, nous devons accéder aux données transmises depuis la première activité

Intent in = getIntent();

Vous devez maintenant obtenir les données du bundle

Bundle b = in.getExtras();

Enfin, obtenez la valeur des données de chaîne associées à la clé nommée "myname"

String s = b.getString("myname");

72voto

Je dois ajouter que les bundles sont utilisés par les activités pour transmettre des données à elles-mêmes dans le futur.

Lorsque l'écran tourne, ou lorsqu'une autre activité est lancée, la méthode protected void onSaveInstanceState(Bundle outState) est invoquée, et l'activité est détruite. Plus tard, une autre instance de l'activité est créée, et public void onCreate(Bundle savedInstanceState) est appelé. Lorsque la première instance de l'activité est créée, le bundle est null; et si le bundle n'est pas null, l'activité continue certaines tâches commencées par son prédécesseur.

Android sauve automatiquement le texte dans les champs de texte, mais il ne sauve pas tout, et parfois des bugs subtils apparaissent.

Le plus grand anti-pattern, cependant, est de supposer que onCreate() ne fait que de l'initialisation. C'est faux, car il doit également restaurer l'état.

Il y a une option pour désactiver ce comportement "re-créer l'activité en cas de rotation", mais cela ne préviendra pas les bugs liés au redémarrage, cela les rendra juste plus difficiles à mentionner.

Notez également que la seule méthode dont l'appel est garanti lorsque l'activité va être détruite est onPause(). (Voir le graphique du cycle de vie de l'activité dans la documentation.)

0 votes

Pourquoi utiliser un ensemble si nous pouvons simplement utiliser une correspondance? Merci Ted!

4 votes

Le Bundle n'est pas seulement utilisé par Activity. Il est également utilisé par Fragment pour préserver les états après une rotation.

60voto

Ted Hopp Points 122617

Mise à jour : En ce qui concerne Android, le terme "bundle" a deux significations complètement distinctes. L'une est détaillée dans ma réponse originale ci-dessous. L'autre est un bundle d'application. Il s'agit d'un nouveau format de fichier d'archive (avec l'extension .aap) qui contient une application Android ainsi que des métadonnées supplémentaires. Vous pouvez téléverser un fichier de bundle d'application au lieu d'un fichier APK d'application pour distribuer votre application via Google Play. Les bundles d'application ont certains avantages par rapport aux fichiers .apk, mais peuvent ne pas être compatibles avec d'autres magasins d'applications (comme l'Amazon App Store). Ces avantages sont décrits dans le lien vers la documentation inclus dans ma réponse originale.

Réponse originale :

Un Bundle est très similaire à un objet Map Java qui fait correspondre des clés String à des valeurs. Il est utilisé pour passer des informations entre les activités et d'autres composants de l'application. Il est également utilisé par le framework pour capturer et restaurer les informations d'état.

La raison pour laquelle Android n'utilise pas simplement des objets Map standards pour cela est que Map est trop flexible ; il peut contenir des objets (comme, par exemple, des flux d'E/S) qui ne peuvent pas être sérialisés. L'API Bundle restreint les types d'objets pouvant être ajoutés à un bundle de telle manière que le contenu du bundle est garanti d'être sérialisable. Le framework Android repose sur cette propriété.

Je vous suggère de lire la documentation sur Fondamentaux de l'application. Cela explique, entre autres, ce que sont les bundles et les intents et à quoi ils servent.

0 votes

Merci! Exactement ce que je cherchais. P.S : Le lien doit être mis à jour.

0 votes

@Abhimanyu - Merci. Le lien a parfaitement fonctionné pour moi.

15voto

scriptocalypse Points 3175

Les bundles peuvent être utilisés pour envoyer des données arbitraires d'une activité à une autre via des Intents. Lorsque vous diffusez un Intent, les activités intéressées (et d'autres BroadcastRecievers) en seront informées. Un intent peut contenir un Bundle afin que vous puissiez envoyer des données supplémentaires avec l'Intent.

Les bundles sont des mappages clé-valeur, donc en quelque sorte, ils sont comme un Hash, mais ils ne se limitent pas strictement à une seule correspondance String / Objet Foo. Notez que seuls certains types de données sont considérés comme "Parcelable" et ils sont explicitement définis dans l'API Bundle.

0 votes

C'est la seule réponse à ce jour qui aborde vraiment la question de l'OP, c'est-à-dire ce qu'est un paquet. stackoverflow.com/a/6236801/1588163 donne plus d'informations.

0 votes

Pourquoi utiliser un pack si nous pouvons simplement utiliser un mappage? Merci!

0 votes

@RuchirBaronia il n'y a pas de raison particulière d'utiliser un Bundle à moins que vous n'ayez l'intention de le passer à une partie de l'API Android qui nécessite des objets Bundle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X