Estoy tratando de trabajar para enviar un objeto de mi clase de cliente desde uno Activity
y mostrarlo en otro Activity
.
El código para la clase de cliente:
public class Customer {
private String firstName, lastName, Address;
int Age;
public Customer(String fname, String lname, int age, String address) {
firstName = fname;
lastName = lname;
Age = age;
Address = address;
}
public String printValues() {
String data = null;
data = "First Name :" + firstName + " Last Name :" + lastName
+ " Age : " + Age + " Address : " + Address;
return data;
}
}
Quiero enviar su objeto de uno Activity
a otro y luego mostrar los datos en el otro Activity
.
¿Cómo puedo lograr eso?
Respuestas:
Una opción podría ser dejar que su clase personalizada implemente la
Serializable
interfaz y luego puede pasar instancias de objetos en la intención adicional utilizando laputExtra(Serializable..)
variante deIntent#putExtra()
método.Pseudocódigo :
Nota: Asegúrese de que cada clase anidada de su clase personalizada principal haya implementado una interfaz serializable para evitar cualquier excepción de serialización. Por ejemplo:
fuente
Parcelable
ES específicamente diseñado para ese propósito (y mucho más rápido queSerializable
). Estoy confundidoParcelable
puede ser bueno para la velocidad, pero es complicado de implementar. ¿Qué pasa si tiene 8 objetos que necesita pasar entre actividades, va a hacer cada unoParcelable
? Tendría más sentido usarSerializable
en su lugar. Cuando implementaParcelable
, debe agregar mucho código a la clase y ordenar los campos de una manera muy específica;Serializable
usted no En última instancia, creo que se trata de cuántos objetos está pasando y qué está tratando de hacer.Serializable
es una interfaz estándar de Java. Simplemente marque una clase Serializable implementando la interfaz, y Java la serializará automáticamente en ciertas situaciones.Parcelable
es una interfaz específica de Android donde implementas la serialización tú mismo. Fue creado para ser mucho más eficiente que Serializable, y para solucionar algunos problemas con el esquema de serialización Java predeterminadoImplemente su clase con Serializable. Supongamos que esta es su clase de entidad:
Estamos enviando el objeto llamado
dene
de la actividad X a la actividad Y. En algún lugar de la actividad X;En la actividad Y estamos obteniendo el objeto.
Eso es.
fuente
classCastException: java.lang.Long
al hacerlo. ¿Puedes explicar por qué?(Serializable)
al objeto?Puede generar código Parcelable para su clase usando este sitio .
fuente
Parcelable
, prefiero mantener mis clases de POJO con uso de AndroidSerializable
.Usar gson para convertir su objeto a JSON y pasarlo por intención. En la nueva Actividad, convierta el JSON en un objeto.
En su
build.gradle
, agregue esto a sus dependenciasEn su Actividad, convierta el objeto a json-string:
En su Actividad receptora, convierta la cadena json nuevamente al objeto original:
Para Kotlin es casi lo mismo
Pasar los datos
Recibe los datos
fuente
Mientras llama a una actividad
En toClass.java recibe la actividad por
Asegúrese de que la clase de cliente implemente parcelable
fuente
En mi experiencia, hay tres soluciones principales, cada una con sus desventajas y ventajas:
Implementando Parcelable
Implementando Serializable
Usar una biblioteca de bus de eventos liviana de algún tipo (por ejemplo, el EventBus de Greenrobot o el Otto de Square)
Parcelable : rápido y estándar de Android, pero tiene un montón de código repetitivo y requiere cadenas codificadas para referencia cuando extrae valores de la intención (sin tipear).
Serializable : placa repetitiva cercana a cero, pero es el enfoque más lento y también requiere cadenas codificadas al extraer valores de la intención (sin tipear).
Event Bus : cero repetitivo, enfoque más rápido y no requiere cadenas codificadas, pero sí requiere una dependencia adicional (aunque generalmente es liviana, ~ 40 KB)
Publiqué una comparación muy detallada sobre estos tres enfoques, incluidos los puntos de referencia de eficiencia.
fuente
Encontré un método simple y elegante:
Método 1
Código para la primera actividad:
Código para la segunda actividad:
encontrarás
objSent
yobjReceived
tendrás lo mismohashCode
, por lo que son idénticos.Pero, ¿por qué podemos pasar un objeto Java de esta manera?
En realidad, Android Binder creará una referencia JNI global para el objeto Java y liberará esta referencia JNI global cuando no haya ninguna referencia para este objeto Java. Binder guardará esta referencia JNI global en el objeto Binder.
* PRECAUCIÓN: este método SOLO funciona a menos que las dos actividades se ejecuten en el mismo proceso; de lo contrario, arroje ClassCastException en (ObjectWrapperForBinder) getIntent (). GetExtras (). GetBinder ("object_value") *
clase ObjectWrapperForBinder definición
Método 2
Pero el Método 2 tiene un problema pequeño pero grave, si el receptor no puede restaurar el objeto java (por ejemplo, ocurre alguna excepción antes de restaurar el objeto java, o la Actividad del receptor no existe en absoluto), entonces el objeto java se convertirá en un huérfano o pérdida de memoria, el Método 1 no tiene este problema, ya que Android Binder manejará esta excepción
Método 3
Para invocar el objeto java de forma remota, crearemos un contrato / interfaz de datos para describir el objeto java, usaremos el archivo aidl
IDataContract.aidl
Código para la primera actividad
Código para la segunda actividad:
cambie el atributo android: process en AndroidManifest.xml a un nombre de proceso no vacío para asegurarse de que la segunda actividad se ejecute en otro proceso
De esta manera, podemos pasar una interfaz entre dos actividades a pesar de que se ejecutan en un proceso diferente, y llamar al método de la interfaz de forma remota
Método 4
El método 3 no parece lo suficientemente simple porque debemos implementar una interfaz de ayuda. Si solo desea realizar una tarea simple y el valor de retorno del método es innecesario, podemos usar android.os.Messenger
Código para la primera actividad (remitente):
Código para la segunda actividad (receptor):
Todos los Messenger.send se ejecutarán en un controlador de forma asincrónica y secuencial.
En realidad, android.os.Messenger también es una interfaz de ayuda, si tiene el código fuente de Android, puede encontrar un archivo llamado IMessenger.aidl
fuente
También puede escribir los datos del objeto en cadenas e ints temporales, y pasarlos a la actividad. Por supuesto, de esa manera, se transportan los datos, pero no el objeto en sí.
Pero si solo desea mostrarlos, y no usar el objeto en otro método o algo así, debería ser suficiente. Lo hice de la misma manera para mostrar datos de un objeto en otra actividad.
También podría pasarlos directamente en lugar de los ivars temporales, pero de esta manera es más claro, en mi opinión. Además, puede configurar los ivars temporales como nulos para que GarbageCollector los limpie antes.
¡Buena suerte!
En una nota al margen: anule toString () en lugar de escribir su propio método de impresión.
Como se menciona en los comentarios a continuación, así es como recupera sus datos en otra actividad:
fuente
Bundle extras = getIntent().getExtras();
String val = extras.getString("fname");
Hice una clase de ayuda singleton que contiene objetos temporales.
En lugar de poner sus objetos dentro de Intent, use IntentHelper:
Dentro de su nueva Actividad, puede obtener el objeto:
Tenga en cuenta que una vez cargado, el objeto se elimina para evitar referencias innecesarias.
fuente
BookActivity.getInstance().recommendationResponse
enRoomsActivity
obj
conviertenull
. Para evitar esto,obj
debe almacenarse en algún lugar para obtenerlo nuevamente. De hecho, la solución Json almacena datos de objetos en Intent.Hay un par de formas por las cuales puede acceder a variables u objetos en otras clases o actividades.
A. Base de datos
B. Preferencias compartidas.
C. serialización de objetos.
D. Una clase que puede contener datos comunes puede denominarse Utilidades comunes. Depende de ti.
E. Transferencia de datos a través de Intentos e Interfaz Parcelable.
Depende de las necesidades de su proyecto.
A. Base de datos
SQLite es una base de datos de código abierto que está integrada en Android. SQLite admite características estándar de bases de datos relacionales como sintaxis SQL, transacciones y declaraciones preparadas.
Tutoriales
SI. Preferencias compartidas
Supongamos que desea almacenar el nombre de usuario. Así que ahora habrá dos cosas, un nombre de usuario clave , valor valor.
Cómo almacenar
Usando putString (), putBoolean (), putInt (), putFloat () y putLong () puede guardar su tipo de dta deseado.
Cómo buscar
http://developer.android.com/reference/android/content/SharedPreferences.html
C. serialización de objetos
La serlización de objetos se usa si queremos guardar un estado de objeto para enviarlo a través de una red o también puede usarlo para su propósito.
Use Java Beans y almacene en él como uno de sus campos y use getters y setter para eso.
JavaBeans son clases Java que tienen propiedades. Piense en las propiedades como variables de instancia privada. Como son privados, la única forma en que se puede acceder desde fuera de su clase es a través de métodos en la clase. Los métodos que cambian el valor de una propiedad se llaman métodos setter, y los métodos que recuperan el valor de una propiedad se llaman métodos getter.
Establezca la variable en su método de correo usando
Luego use la serialización de objetos para serializar este objeto y en su otra clase deserialice este objeto.
En la serialización, un objeto puede representarse como una secuencia de bytes que incluye los datos del objeto, así como información sobre el tipo de objeto y los tipos de datos almacenados en el objeto.
Después de que un objeto serializado se haya escrito en un archivo, se puede leer del archivo y deserializarlo. Es decir, la información de tipo y los bytes que representan el objeto y sus datos se pueden usar para recrear el objeto en la memoria.
Si desea un tutorial para esto, consulte:
Serialización en Java (entrada de blog)
Obtener variable en otras clases (desbordamiento de pila)
D. Utilidades comunes
Puede hacer una clase usted mismo que puede contener datos comunes que necesita con frecuencia en su proyecto.
Muestra
E. Pasando datos a través de intentos
Consulte el tutorial Android: datos de parcelas para pasar entre actividades usando clases parcelables para esta opción de pasar datos.
fuente
Crea tu propia clase de la
Customer
siguiente manera:En su
onCreate()
metodoEn
xyz activity
clase necesitas usar el siguiente código:fuente
La mejor manera es tener una clase (llámela Control) en su aplicación que contendrá una variable estática de tipo 'Cliente' (en su caso). Inicialice la variable en su Actividad A.
Por ejemplo:
Luego vaya a la Actividad B y recójalo desde la clase Control. No olvide asignar un valor nulo después de usar la variable, de lo contrario se desperdiciará memoria.
fuente
Ahora desea pasar el objeto de esta clase en startActivity. Simplemente use esto:
Esto funciona aquí porque MyClass implementa
Serializable
.fuente
Si elige usar la forma que describe Samuh, recuerde que solo se pueden enviar valores primitivos. Es decir, valores que son parcables. Entonces, si su objeto contiene objetos complejos, estos no seguirán. Por ejemplo, variables como Bitmap, HashMap, etc. Son difíciles de pasar por la intención.
En general yo le asesoramiento para enviar tipos de datos primitivos solamente como extras, como String, int, boolean, etc., en su caso sería:
String fname
,String lname
,int age
, yString address
.Mi opinión: los objetos más complejos se comparten mejor implementando un ContentProvider , SDCard , etc. También es posible usar una variable estática , pero esto puede conducir rápidamente a un código propenso a errores ...
Pero de nuevo, es solo mi opinión subjetiva.
fuente
Estoy usando parcelable para enviar datos de una actividad a otra actividad. Aquí está mi código que funciona bien en mi proyecto.
En la actividad A úsalo así:
En ActivityB úsalo así para obtener datos:
fuente
Puedes intentar usar esa clase. La limitación es que no se puede usar fuera de un proceso.
Una actividad:
Otra actividad:
fuente
Inicie otra actividad desde esta actividad y pase parámetros a través del objeto Bundle
Recuperar datos sobre otra actividad (YourActivity)
Esto está bien para un tipo simple de tipo de datos. Pero si quieres pasar datos complejos entre actividades. Necesitas serializarlo primero.
Aquí tenemos el modelo de empleado
Puede usar Gson lib proporcionado por google para serializar datos complejos como este
fuente
Esta pregunta también se discute en otra pregunta de desbordamiento de pila. Eche un vistazo a una solución para pasar datos a través de la intención utilizando Serializable . El punto principal es sobre el uso de
Bundle
objetos que almacenan los datos necesarios dentroIntent
.Para extraer valores:
La ventaja de
Serializable
es su simplicidad. Sin embargo, debe considerar el uso delParcelable
método si necesita transferir muchos datos, ya queParcelable
está específicamente diseñado para Android y es más eficiente queSerializable
. Puedes crear unaParcelable
clase usando:fuente
Cree una clase como bean class e implemente la
Serializable
interfaz. Luego podemos pasarlo por elintent
método, por ejemplo:Luego obténgalo de la otra actividad, por ejemplo:
fuente
Cree dos métodos en su clase personalizada como esta
Ahora en tu actividad de remitente haz esto
Y en tu receptor Actividad
fuente
Sí, usar un objeto estático es, con mucho, la forma más fácil de hacerlo con objetos personalizados no serializables.
fuente
static
es la mejor solución si simplemente no es práctico seguir invocandoputExtra()
para cada propiedad que le gustaría transmitir. Por ejemplo, en este momento, quiero pasar unArrayList
que contiene objetos. También podría hacer mi ArrayList en sustatic
lugar.Los objetos de actividad de Android se pueden destruir y reconstituir. Por lo tanto, tendrá que usar otro enfoque para mirarlos , ¡o cualquier objeto que creen ! - arriba. Es decir, podría pasar como referencia de clase estática, pero luego el identificador de objeto (Java llama a estas "referencias", al igual que SmallTalk; pero no son referencias en el sentido de C o ensamblaje) posiblemente no sea válido más adelante porque una "característica" de Android OE es cualquier actividad que se pueda aniquilar y reconstituir más tarde.
La pregunta original era "Cómo pasar objetos de una actividad a otra en Android" y nadie ha respondido eso. Por supuesto, puede serializar (Serializable, Parcelable, hacia / desde JSON) y pasar una copia de los datos del objeto y se podría crear un nuevo objeto con los mismos datos; pero NO tendrá las mismas referencias / identificadores. Además, muchos otros mencionaron que puede almacenar la referencia en una tienda estática. Y eso funcionará a menos que Android decida onDestroy su actividad.
Por lo tanto, para resolver realmente la pregunta original, necesitaría una búsqueda estática y cada objeto actualizará su referencia cuando / si se vuelve a crear. Por ejemplo, cada actividad de Android se volvería a listar si se llama a onCreate. También puede ver cómo algunas personas usan la lista de tareas para buscar una Actividad por nombre. (el sistema está destruyendo temporalmente esta instancia de la actividad para ahorrar espacio ... getRunningTasks, la lista de tareas es efectivamente una lista especializada de la instancia de objeto más reciente de cada Actividad).
Para referencia:
Entonces, el bus de mensajes es una solución viable. Básicamente "tira". En lugar de tratar de tener referencias a objetos; luego rediseña su diseño para usar MessagePassing en lugar de SequentialCode. Exponencialmente más difícil de depurar; pero le permite ignorar este tipo de comprensión del entorno operativo. Efectivamente, cada acceso al método de objeto se invierte para que la persona que llama publique un Mensaje y el objeto mismo defina un controlador para ese mensaje. Mucho más código, pero puede hacerlo robusto con las restricciones de Android OE.
Si todo lo que desea es la Actividad superior (algo típico en las aplicaciones de Android debido a que se necesita "Contexto" en todas partes), entonces puede hacer que cada Actividad se enumere a sí misma como "superior" en el espacio global estático cada vez que se llama a onResume. Entonces su AlertDialog o lo que sea que necesite un contexto puede simplemente tomarlo desde allí. Además, es un poco asqueroso usar un global, pero puede simplificar pasar un Contexto hacia arriba y hacia abajo en todas partes y, por supuesto, cuando usa un MessageBus, entonces ES global de todos modos.
fuente
Sé que la estática es mala, pero parece que estamos obligados a usarla aquí. El problema con parceables / seriazables es que las dos actividades tienen instancias duplicadas del mismo objeto = pérdida de memoria y CPU.
Actividad de llamada
Actividad llamada (tenga en cuenta que onCreate () y onResume () pueden llamarse varias veces cuando el sistema destruye y recrea actividades)
Otra forma es declarar un campo estático de la clase que desea pasar en esa misma clase. Servirá solo para este propósito. No olvide que puede ser nulo en onCreate, porque su paquete de aplicaciones ha sido descargado de la memoria por el sistema y recargado más tarde.
Teniendo en cuenta que aún necesita manejar el ciclo de vida de la actividad, es posible que desee escribir todos los datos directamente en las preferencias compartidas, doloroso con las estructuras de datos complejas como son.
fuente
Las respuestas anteriores son casi todas correctas, pero para aquellos que no entienden esas respuestas, Android tiene una Intención de clase poderosa con la ayuda de que usted comparte datos entre no solo la actividad sino también otros componentes de Android (receptor de radiodifusión, servicios para contenido siempre que usemos la clase ContetnResolver sin Intención ) En tu actividad construyes intención
En tu actividad de recepción tienes
Debe implementar una interfaz Parceable o Serializable en su objeto para compartir entre actividades. Es difícil implementar Parcealbe en lugar de una interfaz serializable en un objeto, por eso Android tiene un complemento especialmente para esto. Descárguelo y úselo
fuente
Siempre me pregunté por qué esto no puede ser tan simple como llamar a un método de la otra actividad. Recientemente escribí una biblioteca de utilidades que lo hace casi tan simple como eso. Puede consultarlo aquí ( https://github.com/noxiouswinter/gnlib_android/wiki/gnlauncher ).
GNLauncher hace que enviar objetos / datos a una Actividad desde otra Actividad, etc., sea tan fácil como llamar a una función en esa Actividad con los datos requeridos como parámetros. Introduce la seguridad de tipos y elimina todas las molestias de tener que serializar, unir a la intención utilizando teclas de cadena y deshacer la misma en el otro extremo.
Uso
Defina una interfaz con los métodos que desea llamar en la Actividad para iniciar.
Implemente la interfaz anterior en la Actividad para iniciar. También notifique a GNLauncher cuando la actividad esté lista.
En la otra Actividad, obtenga un proxy de la Actividad anterior y llame a cualquier método con los parámetros deseados.
Se iniciará la primera actividad y se llamará al método con los parámetros requeridos.
Prerrequisitos
Consulte https://github.com/noxiouswinter/gnlib_android/wiki#prerequisites para obtener información sobre cómo agregar las dependencias.
fuente
Pase el objeto de una actividad a otra actividad.
(1) actividad fuente
(2) actividad de destino
fuente
Solía establecer objetos con Pacelable o Serializable para transferir, pero cada vez que agrego otras variables al objeto (modelo), tengo que registrarlo todo. Es muy poco conveniente.
Es muy fácil transferir objetos entre actividades o fragmentos.
Android DataCache
fuente
Podemos pasar el objeto de una actividad a otra actividad:
En el interior
poSuppliersDetails
tenemos algunos valores. Ahora estoy enviando este objeto a la actividad objetivo:Cómo conseguir esto en ACtivityTwo:
fuente
Pase una actividad a otra:
Obtener valores:
fuente
Hola a todos, veo muchas buenas opciones, pero me preguntaba por qué no se ha utilizado Binding.
Crear una carpeta es bastante simple ...
Y crear el parcelable para usarlo no es ese éter malo.
Esta lógica es realmente genial porque en realidad estás pasando una referencia de una actividad a otra.
y para implementar esto solo ...
Enviarlo
Recuperar
Diablos, alguien podría volverse loco y hacer de este imbécil un verdadero genérico.
fuente