web-dev-qa-db-fra.com

Comment passer d'un objet d'une activité à une autre sur Android?

Je dois pouvoir utiliser un objet dans plusieurs activités de mon application, et il doit s'agir de l'objet identique. Quelle est la meilleure façon de procéder?

J'ai essayé de rendre l'objet "public statique" afin que d'autres activités puissent y accéder, mais pour une raison quelconque, cela ne le coupe pas. Y a-t-il une autre façon de faire cela?

122
mtmurdock

Lorsque vous créez un objet d'intention, vous pouvez tirer parti des deux méthodes suivantes pour transférer des objets entre deux activités.

putParcelable

putSerializable

Vous pouvez demander à votre classe d’implémenter Parcelable ou Serializable . Ensuite, vous pouvez faire circuler vos classes personnalisées entre les activités. J'ai trouvé cela très utile.

Voici un petit extrait de code que j'utilise

CustomListing currentListing = new CustomListing();
Intent i = new Intent();
Bundle b = new Bundle();
b.putParcelable(Constants.CUSTOM_LISTING, currentListing);
i.putExtras(b);
i.setClass(this, SearchDetailsActivity.class);
startActivity(i);

Et dans le code d'activité qui vient de commencer, ce sera quelque chose comme ça ...

Bundle b = this.getIntent().getExtras();
if (b != null)
    mCurrentListing = b.getParcelable(Constants.CUSTOM_LISTING);
139
anargund

Vous pouvez créer une sous-classe de Application et y stocker votre objet partagé. L'objet Application doit exister pendant la durée de vie de votre application tant qu'il y a un composant actif.

À partir de vos activités, vous pouvez accéder à l’objet d’application via getApplication().

37
Erich Douglass

Cette réponse est spécifique aux situations où les objets à transmettre ont une structure de classe imbriquée. Avec une structure de classe imbriquée, le rendre parcellaire ou sérialisable est un peu fastidieux. Et, le processus de sérialisation d'un objet est pas efficace sur Android . Considérons l'exemple ci-dessous,

class Myclass    {
  int a;
  class SubClass    {
       int b;
  }
}

Avec bibliothèque GSON de Google, vous pouvez directement analyser un objet dans une chaîne au format JSON et le reconvertir au format de l'objet après utilisation. Par exemple,

MyClass src = new MyClass();
Gson gS = new Gson();
String target = gS.toJson(src); // Converts the object to a JSON String

Vous pouvez maintenant transmettre cette chaîne à plusieurs activités sous la forme d'un StringExtra avec l'intention de l'activité.

Intent i = new Intent(FromActivity.this, ToActivity.class);
i.putExtra("MyObjectAsString", target);

Ensuite, dans l'activité de réception, créez l'objet d'origine à partir de la représentation sous forme de chaîne.

String target = getIntent().getStringExtra("MyObjectAsString");
MyClass src = gS.fromJson(target, MyClass.class); // Converts the JSON String to an Object

Il garde les classes originales propres et réutilisables. Surtout, si ces objets de classe sont créés à partir du Web sous forme d'objets JSON, cette solution est très efficace et permet de gagner du temps.

[~ # ~] met à jour [~ # ~]


Bien que la méthode décrite ci-dessus fonctionne dans la plupart des situations, pour des raisons de performances évidentes, ne comptez pas sur le système supplémentaire fourni par Android pour la transmission d'objets. Plusieurs solutions permettent de rendre ce processus flexible et efficace. En voici quelques unes. Chacun a ses avantages et ses inconvénients.

  1. Eventbus
  2. Otto
35
Subin Sebastian

C'est peut-être une réponse impopulaire, mais dans le passé, j'avais simplement utilisé une classe qui contenait une référence statique à l'objet que je souhaitais conserver par le biais d'activités. Alors,

public class PersonHelper
{
    public static Person person;
}

J'ai essayé de parcourir le chemin de l'interface Parcelable, mais j'ai rencontré un certain nombre de problèmes, et la surcharge de votre code ne me paraissait pas attrayante.

6
Chris Stewart

Cela dépend du type de données auquel vous avez besoin d'accéder. Si vous avez un type de pool de données qui doit persister dans Activitys, la réponse d'Erich est la solution. Si vous avez juste besoin de passer quelques objets d’une activité à une autre, vous pouvez les demander à implémenter Serializable et à les transmettre dans les extras de Intent pour démarrer le nouveau Activity. .

5
CaseyB

Votre objet peut également implémenter l'interface Parcelable. Ensuite, vous pouvez utiliser la méthode Bundle.putParcelable() et passer votre objet entre les activités de l'intention.

L'application Photostream utilise cette approche et peut être utilisée comme référence.

5
Fedor