441 votos

¿Cómo enviar un objeto de una Actividad Android a otro utilizando Intenciones?

¿Cómo puedo pasar un objeto de un tipo personalizado de una actividad a otra utilizando el putExtra() método de la clase Intención ?

473voto

fiXedd Puntos 21644

Si sólo está de paso los objetos de su alrededor, entonces Parcelable fue diseñado para esto. Se requiere un poco más de esfuerzo para el uso que el uso de Java nativo de la serialización, pero es la manera más rápida (y me refiero a la forma, MANERA más rápida).

Desde el docs, un ejemplo simple de cómo implementar es:

// 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();
    }
}

Observar que en el caso de que haya más de un campo a recuperar a partir de un determinado Paquete, usted debe hacer esto en el mismo orden en el que los puso en el (es decir, en un sistema de enfoque).

Una vez que los objetos implementar Parcelable es sólo una cuestión de ponerlos en sus Intenciones con putExtra():

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

Entonces usted puede tirar de ellos hacia atrás con getParcelableExtra():

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

Si el Objeto de la Clase implementa Parcelable y Serializable, a continuación, asegúrese de hacer reparto a uno de los siguientes:

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

92voto

David Hedlund Puntos 66192

Usted necesitará serializar el objeto en algún tipo de representación de cadena. Una posible representación de cadena es JSON, y una de las maneras más fáciles para serializar a/de JSON en android, si me preguntan a mí, es a través de Google GSON.

En el caso de que usted juse poner la cadena de valor de retorno (new Gson()).toJson(myObject); y recuperar la cadena de valor y el uso fromJson para volver a su objeto.

Si el objeto no es muy complejo, sin embargo, podría no valer la pena la sobrecarga, y usted podría considerar la posibilidad de pasar los valores independientes de los objetos en su lugar.

76voto

Sridhar Puntos 506

Usted puede enviar un objeto serializable través de la intención

 // 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 {
} 
 

45voto

Peter Ajtai Puntos 26377

Para situaciones en las que usted sabe que va a ser la transferencia de datos dentro de una aplicación, utilice "globales" (como las Clases estáticas)

Aquí es lo que Dianne Hackborn (hackbod - Google Android Ingeniero de Software) que tenía que decir sobre el asunto:

Para situaciones donde se sabe que las actividades se ejecutan en el mismo proceso, usted puede compartir datos a través de variables globales. Por ejemplo, usted podría haber un global HashMap<String, WeakReference<MyInterpreterState>> y cuando haga un nuevo MyInterpreterState venir para arriba con un nombre único para colocarla en el hash del mapa; para enviar a ese estado a otro la actividad, simplemente introduce el nombre único en el hash del mapa y cuando el segunda actividad se inicia se puede recuperar la MyInterpreterState de el hash del mapa con el nombre que recibe.

21voto

Vlad Puntos 355

si su clase de objeto implementa Serializable , que no es necesario hacer nada más, se puede pasar un objeto serializable.
eso es lo que yo uso.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X