¿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?
- Android: ¿Cómo pasar los datos a las sub-actividades?
- Recortar el área de ruta seleccionada desde la vista de imagen personalizada
- ¿Cómo exportar una actividad para que otras aplicaciones puedan llamarla?
- OnCreate llamado después onActivityResult cuando elijo la imagen de la galería
- Mostrar vista en toda mi aplicación
- ¿Es el método onSaveInstanceState (Bundle) llamado después onPause ()?
- Cómo hacer que el servicio Android se comunique con la actividad
- Cómo pasar datos de la escena Unity a la actividad de Android
- ¿Puedo obligar al botón de retroceso de Android a retroceder dos pasos en la pila de actividad?
- Android: permiso denegado Error al cambiar la actividad del lanzador
- ¿Cómo obtener el contenido de una pestaña dentro de TabHost?
- Actividad con fondo transparente
- Biblioteca de Android utilizando los recursos del proyecto principal
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.
- Eventbus
- 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.
- Android: ¿Cómo cambiar el icono "Home" de ActionBar para que sea algo distinto del icono de la aplicación?
- Obtener APK de la aplicación instalada