2010-08-23 21 views
27

Estoy trabajando en un pequeño proyecto de Android donde es necesario compartir algunos datos entre varias actividades y un servicio que se ejecuta en un proceso separado. Me gustaría saber cuáles son mis opciones en términos de compartir datos. Clase de aplicación? IPC? Basado en archivos? Transmisiones? ¡Gracias chicos!Compartir datos entre actividades y servicios

Respuesta

51

1. Parece que necesitas transmitir algo de información. Usted podrá configurar los receptores de difusión en cualquier actividad/servicio que le gustaría recibir notificaciones.

Leer más en línea sobre Broadcastreceiver y sobre send broadcast

2. ¿Cómo paso datos entre Actividades/Servicios dentro de una sola aplicación?

Depende del tipo de datos que desea compartir:

tipos de datos primitivos Para compartir datos entre primitivas Actividades/Servicios en una aplicación, utilice Intent.putExtras(). Para pasar datos primitivos que deban persistir, utilice el mecanismo de almacenamiento Preferences.

objetos

no persistentes Para compartir objetos definidos por el usuario no persistentes complejos de corta duración, se recomiendan los siguientes enfoques:

La clase android.app.Application

El androide .app.Application es una clase base para aquellos que necesitan mantener el estado global de la aplicación. Se puede acceder a través de getApplication() desde cualquier actividad o servicio. Tiene un par de métodos de ciclo de vida y será instanciado por Android automáticamente si lo registra en AndroidManifest.xml.

Un campo public static/método

Una forma alternativa de hacer que los datos sean accesibles a través de Actividades/Servicios es el uso de campos y/o métodos estáticos públicos. Puede acceder a estos campos estáticos desde cualquier otra clase en su aplicación. Para compartir un objeto, la actividad que crea su objeto establece un campo estático para apuntar a este objeto y cualquier otra actividad que quiera usar este objeto solo accede a este campo estático.

Un HashMap de WeakReferences a objetos

También puede utilizar un HashMap de WeakReferences a objetos con claves largas. Cuando una actividad quiere pasar un objeto a otra actividad, simplemente coloca el objeto en el mapa y envía la clave (que es un Long único basado en un contador o marca de tiempo) a la actividad del destinatario a través de extras de intención. La actividad del destinatario recupera el objeto usando esta clave.

Un Singleton clase

Hay ventajas en el uso de un Singleton estático, como se puede hacer referencia a ellos sin poner en getApplication() para una clase específica de la aplicación, o ir a la molestia de colgar una interfaz en todas sus subclases de aplicaciones para que sus diversos módulos puedan referirse a esa interfaz en su lugar.

Pero, el ciclo de vida de una estática no está bajo su control; así cumplir con el modelo de ciclo de vida, la clase de aplicación debe iniciar y derribar estos objetos estáticos en el onCreate() y onTerminate() de la clase de aplicación

persistentes Objetos Incluso cuando aparece una aplicación a continúa ejecutándose, el sistema puede elegir eliminar su proceso y reiniciarlo más tarde. Si tiene datos que necesita para pasar de una invocación de actividad a la siguiente, debe representar esos datos como un estado que se guarda por una actividad cuando se le informa que podría desaparecer.

Para compartir objetos definidos por el usuario persistentes complejos, se recomiendan los siguientes enfoques:

Application Preferences 
Files 
contentProviders 
SQLite DB 

Si los datos compartidos necesita ser conservado a través de los puntos en el proceso de solicitud puede ser matado, a continuación, colocar los datos en persistente almacenamiento como Preferencias de aplicación, SQLite DB, Archivos o ContentProviders. Consulte Data Storage para obtener más detalles sobre cómo usar estos componentes.

+1

Guau, muchas gracias por esta respuesta tan informativa. – Jack

+1

por qué desperdiciar tanta memoria en abstracciones. ¿No hay una opción para datos globales? Por qué los chicos de Java/Android pierden tanta memoria – mSO

+0

el servicio y la actividad se ejecutan como procesos diferentes, por lo que no comparten espacio de memoria, por lo que la mayoría de las sugerencias enumeradas anteriormente no funcionarán. – whoami

Cuestiones relacionadas