763 votes

Comment envoyer un objet d’une activité Android à une autre à l’aide d’intentions ?

<p>Comment puis-je passer un objet d’un type personnalisé d’une <a href="http://developer.android.com/reference/android/app/Activity.html">activité</a> à une autre en utilisant la <code></code> méthode de la classe <a href="http://developer.android.com/reference/android/content/Intent.html">intention</a>?</p>

693voto

fiXedd Points 21644

Si vous êtes juste de passage des objets qui les entourent, puis Parcelable a été conçu pour cela. Elle nécessite un peu plus d'effort à utiliser que Java native de la sérialisation, mais c'est beaucoup plus rapide (et je veux dire de façon, de FAÇON plus rapide).

De la documentation, un exemple simple de la façon de mettre en œuvre est:

// simple class that just has one member property as an example
public class MyParcelable implements Parcelable {
    private int mData;

    /* everything below here is for implementing Parcelable */

    // 99.9% of the time you can just ignore this
    public int describeContents() {
        return 0;
    }

    // write your object's data to the passed-in Parcel
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(mData);
    }

    // this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methods
    public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() {
        public MyParcelable createFromParcel(Parcel in) {
            return new MyParcelable(in);
        }

        public MyParcelable[] newArray(int size) {
            return new MyParcelable[size];
        }
    };

    // example constructor that takes a Parcel and gives you an object populated with it's values
    private MyParcelable(Parcel in) {
        mData = in.readInt();
    }
}

Observons que dans le cas où vous avez plus d'un champ à récupérer à partir d'une Parcelle donnée, vous devez le faire dans le même ordre que vous les mettez dans (qui est, dans une FIFO).

Une fois que vous avez vos objets de mettre en oeuvre Parcelable c'est juste une question de les mettre dans vos Intentions avec putExtra():

Intent i = new Intent();
i.putExtra("name_of_extra", myParcelableObject);

Ensuite, vous pouvez vous en sortir avec getParcelableExtra():

Intent i = getIntent();
MyParcelable myParcelableObject = (MyParcelable) i.getParcelableExtra("name_of_extra");

Si votre Objet de Classe implémente Parcelable et Serializable alors assurez-vous de ne jeter à l'une des opérations suivantes:

i.putExtra((Parcelable) myParcelableObject);
i.putExtra((Serializable) myParcelableObject);

165voto

David Hedlund Points 66192

Vous aurez besoin de sérialiser votre objet dans une sorte de représentation de chaîne. Une possible représentation de chaîne est JSON, et l'un des moyens les plus faciles pour sérialiser/à partir de JSON dans android, si vous me demandez, est par le biais de Google GSON.

Dans ce cas, vous juse mettre la chaîne de valeur de retour à partir de (new Gson()).toJson(myObject); et de récupérer la chaîne de valeur et à l'utilisation fromJson pour l'activer de nouveau dans votre objet.

Si votre objet n'est pas très complexe, cependant, il pourrait ne pas être en vaut la surcharge, et vous pourriez envisager de passer le séparer les valeurs de l'objet à la place.

143voto

Sridhar Points 506

Vous pouvez envoyer un objet sérialisable par intention

 // send where details is object
ClassName details = new ClassName();
Intent i = new Intent(context, EditActivity.class);
i.putExtra("Editing", details);
startActivity(i);


//receive
ClassName model = (ClassName) getIntent().getSerializableExtra("Editing");

And 

Class ClassName implements Serializable {
} 
 

63voto

Peter Ajtai Points 26377

Pour les situations où vous savez que vous allez être le passage des données dans une application, utiliser "globals" (comme les Classes statiques)

Ici est ce que Dianne Hackborn (hackbod - un Logiciel Android de Google Ingénieur) avait à dire sur le sujet:

Pour les situations où vous savez que les activités sont en cours d'exécution dans la même processus, vous pouvez juste partager des données à travers des globales. Par exemple, vous pourrait avoir un mondial HashMap<String, WeakReference<MyInterpreterState>> et quand vous faites une nouvelle MyInterpreterState venir avec un nom unique pour et de le mettre dans la table de hachage de la carte; envoyer cet état à un autre l'activité, il suffit de mettre le nom unique dans la table de hachage de la carte et lorsque l' la deuxième activité a commencé, il peut récupérer les MyInterpreterState de le hachage de la carte avec le nom qu'il reçoit.

45voto

Pedro Romão Points 143

Votre classe devrait implémenter Serializable ou Serializable.

 public class MY_CLASS implements Serializable
 

Une fois cela fait, vous pouvez envoyer un objet sur putExtra

 intent.putExtra("KEY", MY_CLASS_instance);

startActivity(intent);
 

Pour obtenir des extras, il suffit de faire

 Intent intent = getIntent();
MY_CLASS class = (MY_CLASS) intent.getExtras().getSerializable("KEY");
 

J'espère que ça aide: D

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: