2010-09-19 18 views
18

Así que me estoy realmente confundiendo sobre cómo hacer todo esto y esperaba que alguien pudiera analizarlo un poco.Android: Pasar datos entre el servicio y la actividad

Tengo un servicio que siempre debe estar ejecutándose, y en ciertos momentos debe alertar al usuario de que se debe completar una tarea (probablemente a través de un icono de la barra de notificaciones). Cuando el usuario acepta la tarea, el servicio necesita buscar en la base de datos local, construir algunos objetos no primitivos y asignarlos a la actividad que acaba de iniciar.

He mirado por todas partes y me he confundido mucho sobre un enfoque adecuado, así que tengo algunas preguntas para ayudarme a entenderlo.

  1. Si una actividad crea una base de datos SQLite local, ¿el servicio y las actividades de esa aplicación pueden acceder a esa misma base de datos más adelante?

  2. ¿El servicio y la actividad deben estar en el mismo paquete o en paquetes separados? Pensaría que no, pero por alguna razón recuerdo haber visto algo sobre esto en otro lado.

  3. ¿Cómo haré la transmisión de datos del servicio a la actividad? Estaba pensando en un proveedor de contenido, pero parece que debería haber una manera más fácil para que el servicio simplemente entregue los datos. Similar a un Intento pero para los no primitivos.

Gracias de antemano.

Respuesta

12
  1. Si las clases de Servicio y Actividad están en el mismo paquete, creo que deberían poder acceder al mismo espacio de almacenamiento privado.

  2. Los pondría en el mismo paquete, ya que son parte de la misma estructura general de la aplicación.

  3. Agrupe los datos en los extras de Intent como pares clave-valor e inicie la actividad.


Intent intent = new Intent(this, SecondActivity.class); 
Bundle b = new Bundle(); 

// see Bundle.putInt, etc. 
// Bundle.putSerializable for full Objects (careful there) 
b.putXXXXX("key", ITEM); 
intent.putExtras(b); 
startActivity(intent); 

// -- later, in Activity 
Bundle b = this.getIntent().getExtras(); 
int i = b.getInt("key"); 
+6

¿Qué debe hacer si ambos no están en el mismo paquete? – Nirav

+2

@Nirav: Intent intennt = new Intent (this, com.example.somepackage.SecondActivity.class); –

5

en la misma aplicación, servicios y actividades pueden tener acceso a la misma base de datos SQLite. Sugeriría usar un sqlite db. Para simplificar, configure su conexión de servicio como local, por lo que no necesita las interfaces AIDL y las comunicaciones entre procesos.

Desde un servicio, para notificar al usuario, use el NotificationManager. Puede pasar un objeto serializable de su servicio a un intento, luego a la actividad que se inicia, pero le sugiero que pase una ID de db.

Hemos creado una nueva herramienta Android ORM que puede usar para esto. Incluye prototipos de clases de actividad y servicio que puedes usar para construir tu aplicación. Todavía no tengo una aplicación de ejemplo que use el servicio, pero la codificaré a continuación y la subiré lo antes posible.

Ver ...

http://ormlite.com/

Y mi blog ...

http://touchlabblog.tumblr.com/

actualmente hacer algunas cosas db bastante pesado en la aplicación que estoy trabajando. Un servicio verifica con un servidor las actualizaciones y básicamente hace lo que está buscando hacer. Es todo bastante simple.

+1

¡Actualización! Creé una aplicación de ejemplo con un servicio que "hace cosas". Todavía no lo puse en el repositorio svn, pero puedes descargarlo y darle un giro. Ten cuidado. No hay un botón "apagado" para el servicio ... http://www.kagii.com/downloads/NotifyService.tar.gz –

Cuestiones relacionadas