2012-05-07 12 views
6

La comunicación entre dos procesos diferentes (un servicio y una actividad) en Android se puede administrar via Messenger or AIDL: es suficiente que una actividad se vincule a un servicio.¿Cómo manejar el IPC entre un servicio y una actividad (y su subactividad)?

Sin embargo, ¿qué sucede si esta actividad tiene una o más subactividad? Desde el momento en que la actividad principal comienza una subactividad, me gustaría que la comunicación sea redirigida a la subactividad; Del mismo modo, cuando se destruye la subactividad, me gustaría que la comunicación se redirige de nuevo a la actividad principal, etc ..

Ejemplo # 1:

  1. MyService < --- --- IPC> MainActivity
  2. MainActivity lanza subactividad, entonces MyService < --- --- IPC> subactividad
  3. subactividad se destruye, entonces MyService < --- --- IPC> MainActivity

Ejemplo # 2:

  1. MyService < --- IPC ---> MainActivity
  2. MainActivity lanza FirstSubActivity, entonces MyService < --- IPC ---> FirstSubActivity
  3. FirstSubActivity lanza SecondSubActivity, entonces MyService < --- --- IPC> SecondSubActivity
  4. SecondSubActivity se destruye, entonces MyService < --- --- IPC> FirstSubActivity
  5. FirstSubActivity se destruye, entonces MyServi ce < --- IPC ---> MainActivity

¿Cómo manejar estos casos?

Respuesta

5

Usted desea tener una sola entidad que sea responsable de vincular el servicio y aferrarse a la conexión y necesita que esa entidad NO sea una instancia de la Actividad. Prueba esto:

  • crear una clase base (BaseActivity) que subclases Actividad
  • Deducir todas sus actividades de BaseActivity
  • administrar la conexión entre la aplicación y el servicio utilizando métodos de BaseActivity. BaseActivity necesitará tener variables estáticas (de clase) que hagan un seguimiento de la conexión al servicio y se ocupen del enlace al servicio y lo cierren cuando haya terminado con el mismo.
  • Asegúrese de utilizar el contexto de la aplicación (no el contexto de la actividad) cuando se vincula al servicio para que el sistema operativo no anule la conexión con el servicio cuando se destruye la actividad.

De esta manera, no tiene que preocuparse por crear y destruir conexiones entre las diferentes actividades y su servicio. Solo hay una conexión entre su aplicación completa (todas las actividades) y su servicio.

Me doy cuenta de que no he explicado todos los detalles sangrientos, pero espero que tenga la idea básica.

1

¿Alguna vez ha pensado en la siguiente solución? En lugar de vincular Activity to Service, puede iniciar su actividad con el comando startService() y luego comunicarse con Intents and Receivers. De esta forma puede iniciar otra actividad, llamando al servicio por su estado e interactuando con él donde lo desee :)

+0

La documentación sobre [sendBroadcast] (http://developer.android.com/reference/android/content/Context.html#sendBroadcast%28android.content.Intent%29) dice que _no los resultados se propagan desde los receptores y receptores no puede abortar la transmisión. – enzom83

+0

Eso es verdad. Pero en sus ejemplos, he visto que ha puesto énfasis en la comunicación entre el servicio y la actividad . Por lo que el mecanismo que he descrito anteriormente es simple y si usa correctamente los Receptores y las Intenciones de transmisión puede resolver su problema. (Eso es en mi opinión) –

+0

Claro, podría usar un receptor de transmisión en la actividad para recibir la intención del servicio, y otro receptor de difusión en el servicio para recibir el intento de la actividad. Sin embargo, al enviar un mensaje en emisión, no es posible hacerlo de modo que solo sea recibido por un paquete específico, porque no es compatible con las versiones anteriores a 4: [_ Alternativamente, comenzando con ICE_CREAM_SANDWICH, también puede restringir de forma segura transmitido a una única aplicación con Intent.setPackage_] (http://developer.android.com/reference/android/content/BroadcastReceiver.html). – enzom83

Cuestiones relacionadas