¿Cómo paso un objeto de una actividad a otra en Android?

Necesito poder usar un objeto en múltiples actividades dentro de mi aplicación, y debe ser el mismo objeto. ¿Cuál es la mejor manera de hacer esto?

Intenté hacer el objeto “público estático” para que otras actividades lo puedan acceder, pero por alguna razón esto simplemente no lo está recortando. ¿Hay otra manera de hacer esto?

Cuando crea un objeto de intención, puede aprovechar dos métodos para pasar objetos entre dos actividades.

putParcelable

putSerializable

Puede hacer que su clase implemente Parcelable o Serializable . Luego puede pasar sus clases personalizadas a través de actividades. He encontrado esto muy útil.

Aquí hay un pequeño fragmento de código que estoy usando

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); 

Y en el código de actividad recién iniciado será algo como esto …

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

Puede crear una subclase de Aplicación y almacenar allí su objeto compartido. El objeto Aplicación debe existir durante toda la vida de su aplicación, siempre que haya algún componente activo.

Desde sus actividades, puede acceder al objeto de la aplicación a través de getApplication() .

Esta respuesta es específica para las situaciones en las que los objetos a pasar tienen una estructura de clase anidada. Con una estructura de clases anidada, hacer que sea Parcelable o Serializable es un poco tedioso. Y, el proceso de serialización de un objeto no es eficiente en Android . Considere el siguiente ejemplo,

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

Con la biblioteca GSON de Google, puede analizar directamente un objeto en un String con formato JSON y convertirlo de nuevo al formato del objeto después del uso. Por ejemplo,

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

Ahora puede pasar esta secuencia a través de actividades como un StringExtra con la intención de la actividad.

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

Luego, en la actividad de recepción, crea el objeto original a partir de la representación de cadena.

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

Mantiene las clases originales limpias y reutilizables. Por encima de todo, si estos objetos de clase se crean a partir de la web como objetos JSON, esta solución es muy eficiente y ahorra tiempo.

ACTUALIZAR


Si bien el método explicado anteriormente funciona para la mayoría de las situaciones, por razones obvias de rendimiento, no confíe en el sistema adicional de Android para pasar objetos. Hay una serie de soluciones que hacen que este proceso sea flexible y eficiente, aquí hay algunas. Cada uno tiene sus propios pros y contras.

  1. Eventbus
  2. Otón

Tal vez es una respuesta impopular, pero en el pasado simplemente he usado una clase que tiene una referencia estática al objeto que quiero persistir a través de las actividades. Asi que,

 public class PersonHelper { public static Person person; } 

Traté de ir por la ruta de la interfaz Parcelable, pero encontré una serie de problemas y la sobrecarga en el código no me resultaba atractiva.

Depende del tipo de datos a los que necesite acceder. Si tiene algún tipo de conjunto de datos que debe persistir en la Activity s, entonces la respuesta de Erich es el camino a seguir. Si solo necesita pasar algunos objetos de una actividad a otra, puede hacer que implementen Serializable y pasarlos en los extras del Intent para comenzar la nueva Activity .

Su objeto también puede implementar la interfaz Parcelable. Luego puede usar el método Bundle.putParcelable() y pasar su objeto entre actividades dentro de la intención.

La aplicación Photostream usa este enfoque y puede usarse como referencia.