Cómo enviar objetos a través de un paquete

Necesito pasar una referencia a la clase que hace la mayoría de mi procesamiento a través de un paquete.

El problema es que no tiene nada que ver con intentos o contextos y tiene una gran cantidad de objetos no primitivos. ¿Cómo empaquetar la clase en un parcelable / serializable y pasarlo a un startActivityForResult ?

11 Solutions collect form web for “Cómo enviar objetos a través de un paquete”

Determinar qué camino tomar requiere responder no solo a la pregunta clave de "¿Por qué" de CommonsWare sino también a la pregunta de "¿a qué?". Lo estás pasando

La realidad es que lo único que puede ir a través de los paquetes es datos sencillos – todo lo demás se basa en interpretaciones de lo que significa o apunta a esos datos. No puedes literalmente pasar un objeto, pero lo que puedes hacer es una de tres cosas:

1) Usted puede romper el objeto hasta sus datos de constitución, y si lo que está en el otro extremo tiene conocimiento del mismo tipo de objeto, puede montar un clon de los datos serializados. Así es como la mayoría de los tipos comunes pasan por paquetes.

2) Puede pasar un mango opaco. Si usted está pasando en el mismo contexto (aunque uno podría preguntar por qué molestarse) que será un mango que puede invocar o dereference. Pero si lo pasas a través de Binder a un contexto diferente, su valor literal será un número arbitrario (de hecho, estos números arbitrarios cuentan secuencialmente desde el inicio). No puedes hacer nada más que seguirlo hasta que lo devuelvas al contexto original, lo que hará que Binder lo vuelva a transformar en el identificador original, haciéndolo útil de nuevo.

3) Puede pasar un identificador mágico, como un descriptor de archivo o una referencia a ciertos objetos os / platform, y si establece los indicadores correctos Binder creará un clon que apunte al mismo recurso para el destinatario, que en realidad se puede utilizar en el otro extremo. Pero esto sólo funciona para un muy pocos tipos de objetos.

Lo más probable es que esté pasando su clase sólo para que el otro extremo pueda seguirla y devolverla más tarde, o lo está pasando a un contexto en el que se puede crear un clon a partir de datos constituyentes serializados … o bien Usted está intentando hacer algo que apenas no va a trabajar y usted necesita repensar el acercamiento entero.

También puede utilizar Gson para convertir un objeto a un JSONObject y pasarlo al paquete. Para mí fue la forma más elegante que encontré para hacer esto. No he probado cómo afecta el rendimiento.

En la Actividad Inicial

 Intent activity = new Intent(MyActivity.this,NextActivity.class); activity.putExtra("myObject", new Gson().toJson(myobject)); startActivity(activity); 

En la siguiente actividad

 String jsonMyObject; Bundle extras = getIntent().getExtras(); if (extras != null) { jsonMyObject = extras.getString("myObject"); } MyObject myObject = new Gson().fromJson(jsonMyObject, MyObject.class); 

La interfaz Parcelable es una buena manera de pasar un objeto con un Intent.

¿Cómo puedo hacer mis objetos personalizados Parcelable? Es una muy buena respuesta sobre cómo usar Parcelable

Los documentos oficiales de google también incluyen un ejemplo

Puede utilizar el estado de aplicación global.

Actualizar:

Personaliza y luego agrega esto a tu AndroidManifest.xml:

 <application android:label="@string/app_name" android:debuggable="true" android:name=".CustomApplication" 

Y luego tener una clase en su proyecto como este:

 package com.example; import android.app.Application; public class CustomApplication extends Application { public int someVariable = -1; } 

Y porque " se puede acceder a través de getApplication () desde cualquier actividad o servicio ", lo usas así:

 CustomApplication application = (CustomApplication)getApplication(); application.someVariable = 123; 

Espero que ayude.

También puede hacer sus objetos Serializable y usar los métodos getSerializable y putSerializable del Bundle.

Una forma más de enviar objetos a través del paquete es mediante bundle.putByteArray
Código de muestra

 public class DataBean implements Serializable { private Date currentTime; public setDate() { currentTime = Calendar.getInstance().getTime(); } public Date getCurrentTime() { return currentTime; } } 

Poner objeto de DataBean en paquete:

 class FirstClass{ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Your code... //When you want to start new Activity... Intent dataIntent =new Intent(FirstClass.this, SecondClass.class); Bundle dataBundle=new Bundle(); DataBean dataObj=new DataBean(); dataObj.setDate(); try { dataBundle.putByteArray("Obj_byte_array", object2Bytes(dataObj)); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } dataIntent.putExtras(dataBundle); startActivity(dataIntent); } 

Conversión de objetos en arrays de bytes

 /** * Converting objects to byte arrays */ static public byte[] object2Bytes( Object o ) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream( baos ); oos.writeObject( o ); return baos.toByteArray(); } 

Obtener el objeto de nuevo de Bundle:

 class SecondClass{ DataBean dataBean; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Your code... //Get Info from Bundle... Bundle infoBundle=getIntent().getExtras(); try { dataBean = (DataBean)bytes2Object(infoBundle.getByteArray("Obj_byte_array")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

Método para obtener objetos de arrays de bytes:

 /** * Converting byte arrays to objects */ static public Object bytes2Object( byte raw[] ) throws IOException, ClassNotFoundException { ByteArrayInputStream bais = new ByteArrayInputStream( raw ); ObjectInputStream ois = new ObjectInputStream( bais ); Object o = ois.readObject(); return o; } 

Espero que esto ayude a otros amigos.

Solución posible:

 Bundle bundle = new Bundle(); bundle.putSerializable(new CustomObject()); 

Clase CustomObject:

 class CustomObject implements Serializable{ private SubCustomObject1 sc1; private SubCustomObject2 sc2; } 

Subcustom objetos:

 class SubCustomObject1 implements Serializable{ } class SubCustomObject2 implements Serializable{ } 

También quiero recomendar este excelente post de blog que compara todas las diferentes opciones y su impacto en el rendimiento

Esta es una respuesta muy tardía a mi propia pregunta, pero sigue recibiendo atención, por lo que siento que debo abordarla. La mayoría de estas respuestas son correctas y manejan el trabajo perfectamente. Sin embargo, depende de las necesidades de la aplicación. Esta respuesta se utilizará para describir dos soluciones a este problema.

Solicitud

La primera es la Aplicación , ya que ha sido la más hablada sobre la respuesta aquí. La aplicación es un buen objeto para colocar entidades que necesitan una referencia a un Contexto. Un `ServerSocket` sin duda necesitaría un contexto (para el archivo I / o o simples` ListAdapter` actualizaciones). Yo, personalmente, prefiero esta ruta. Me gustan las aplicaciones, que son útiles para la recuperación de contexto (porque se pueden hacer estáticos y no es probable que causen una pérdida de memoria) y tienen un ciclo de vida simple.

Servicio

El servicio es el segundo. Un "servicio" es en realidad la mejor opción para mi problema porque es lo que los servicios están diseñados para hacer:

 Un servicio es un componente de aplicación que puede realizar operaciones largas en
 El fondo y no proporciona una interfaz de usuario.

Los servicios son ordenados en que tienen un ciclo de vida más definido que es más fácil de controlar. Además, si es necesario, los servicios pueden ejecutarse externamente a la aplicación (por ejemplo, en el arranque). Esto puede ser necesario para algunas aplicaciones o simplemente para una función elegante.

Ésta no era una descripción completa de cualquiera, pero dejé acoplamientos a los docs para los que deseen investigar más. En general, el Service es mejor para la instancia que necesitaba: ejecutar un ServerSocket en mi dispositivo SPP.

Me encontré con esta pregunta cuando estaba buscando una manera de pasar un objeto de fecha. En mi caso, como se sugirió entre las respuestas, he utilizado Bundle.putSerializable (), pero que no funcionaría para una cosa compleja como el DataManager descrito en la publicación original.

Mi sugerencia que dará un resultado muy similar a poner dicho DataManager en la aplicación o hacerla Singleton es utilizar la inyección de la dependencia y atar el DataManager a un alcance de Singleton e inyectar el DataManager dondequiera que sea necesario. No sólo obtendrá el beneficio de una mayor testabilidad, sino que también obtendrá un código más limpio sin toda la placa de la caldera "pasar las dependencias entre las clases y las actividades" código. (Robo) Guice es muy fácil de trabajar y el nuevo marco Dagger parece prometedor también.

Otra forma sencilla de pasar objetos usando un lote:

  • En el objeto de clase, cree una lista estática u otra estructura de datos con una clave
  • Cuando se crea el objeto, ponerlo en la estructura de lista / datos con la clave (es la marca de tiempo larga cuando se crea el objeto)
  • Crear el método static getObject (long key) para obtener el objeto de la lista
  • En el paquete pasar la clave, por lo que puede obtener el objeto más tarde de otro punto en el código
  • ¿Cómo poner un Vector en un intento.extra?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.