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

Tengo que ser capaz de utilizar un objeto en múltiples actividades dentro de mi aplicación, y tiene que ser el mismo objeto. ¿Cuál es la mejor manera de hacer esto?

He intentado hacer el objeto "público estático" para que pueda ser accedido por otras actividades, pero por alguna razón esto simplemente no lo está cortando. ¿Hay otra manera de hacer esto?

Cuando está creando un objeto de intención, puede aprovechar los siguientes dos métodos para pasar objetos entre dos actividades.

Párcelable

PutSerializable

Puede hacer que su clase implemente Parcelable o Serializable . A continuación, puede pasar alrededor de sus clases personalizadas a través de las 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 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 la aplicación siempre y cuando exista algún componente activo.

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

Esta respuesta es específica para situaciones en las que los objetos que se van a pasar tienen una estructura de clase anidada. Con la estructura de clase anidada, haciéndola Parcelable o Serializeable es un poco tediosa. 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 un objeto directamente en una cadena con formato JSON y convertirlo de nuevo al formato de objeto después de su 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 cadena a través de actividades como StringExtra con la intención de la actividad.

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

A continuación, en la actividad de recepción, cree el objeto original desde 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 desde la web como objetos JSON, entonces esta solución es muy eficiente y ahorra tiempo.

ACTUALIZAR


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

  1. Eventbus
  2. Otón

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

Tal vez sea una respuesta impopular, pero en el pasado simplemente he utilizado 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; } 

Intenté ir abajo de la trayectoria de interfaz Parcelable, pero funcioné en un número de problemas con él y la sobrecarga en su código era desagradable a mí.

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

La aplicación Photostream utiliza este enfoque y puede utilizarse como referencia.

  • Java.lang.IllegalStateException: no puede encontrar el método onClick del botón en Android Studio
  • OnCreate () vs OnStart ()
  • Causado por java.lang.NullPointerException: Intenta invocar el método virtual 'int android.graphics.Bitmap.getWidth ()' en una referencia de objeto nulo
  • ¿Cómo hacer que el estilo personalizado de tema de ventanaBackground funcione en todos los dispositivos Android?
  • Biblioteca de SlidingMenu con ActionBarSherlock
  • Android Development - AlertDialog mostrando dentro de la actividad de la pestaña
  • ¿Cómo usar una interfaz en varias clases en java?
  • Aclaración sobre la documentación de Android
  • Llamar a la actividad personalizada como startActivityForResult
  • Android - restore últimos vistos Actividad
  • ¿Debo especificar el nombre de la actividad principal en el manifiesto de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.