2010-06-29 23 views
10

Estoy tratando de refactorizar/rediseñar una aplicación de Android. Actualmente, tengo una actividad de IU (Activity 1) que crea un DataThread. Este hilo es responsable de la E/S de red e interactúa (proporciona datos) con la actividad de IU a través de handler.Servicio de Android interactuando con múltiples actividades

Ahora, deseo agregar otra actividad (una nueva pantalla de interfaz de usuario con video) - Activity 2. Activity 1 sigue siendo la actividad principal. Activity 2 se invocarán cuando el usuario haga clic en un botón en Activity 1. Los datos de Activity 2 también provienen del DataThread.

Mi idea es poner la lógica de mi DataThread dentro de un Android Service (DataService). Mi pregunta es: ¿puede más que en la actividad vincular a mi DataService al mismo tiempo? ¿Hay alguna manera de decirle al servicio que proporcione datos solo a una actividad específica?

¿Alguna otra idea es bienvenida?

Gracias de antemano.

Respuesta

4

Normalmente unijo mi servicio de la clase Application y tengo algún tipo de clase de controlador (como un "mediador" supongo ... no estoy seguro de cómo se denominan todos estos patrones) en la aplicación que maneja las comunicaciones entre servicios y cualquiera que sea la Actividad activa.

Esto implicaría escribir su propia clase de Aplicación y decirle al Manifiesto que use esta. Fui en más detalles sobre este proceso en un hilo anterior:

More efficient way of updating UI from Service than intents?

Se podría realizar un seguimiento de la actividad "actualmente activo" mediante el envío de la clase Application una referencia a sí mismo en onResume (también se explica en el ejemplo encima). Esto puede lograrse derivando sus Actividades de una clase base común que tiene una forma de obtener su clase de Aplicación (casting de getApplicationContext), y en esta clase base 'onResume, envíe un ref de sí mismo a la aplicación. Luego, puede registrar actividades por nombre con su DataServiceController, por ejemplo, y enviar mensajes a la Actividad actual solo si está registrado con el Controlador para recibirlos.

+0

estoy buscando una solución como esta, ¿hay algún ejemplo de trabajo o un enlace para obtener más detalles acerca de esta implementación, thx – Sam

+7

@Rich ¿Cómo se las arregla para desvincularse limpiamente del Servicio cuando la aplicación termina si usted lo ha vinculado en su clase de aplicación? Debido a que Application # onTerminate() nunca se llama a los dispositivos de producción, consulte JavaDoc http://developer.android.com/reference/android/app/Application.html –

+0

@SvenJacobs La única forma en que puedo pensar es: deje que el servicio llame ' stopSelf() 'después de un tiempo cuando todas las actividades están en pausa. Las actividades tienen que indicarle al servicio su estado en este caso cuando se pausan. Las actividades nunca llaman 'unbindService()' y el servicio se vincula al 'applicationContext' en cada onResume() de cada actividad. – OneWorld

6

Definitivamente más de una actividad puede vincularse a su servicio. Obtendrá un onBind() para cada uno que se una. Entonces, su servicio manejaría idealmente la lógica de interactuar con múltiples actividades identificándolas mediante una ID o la intención (con sus propios ID para cada actividad como extras) de onBind() en su servicio. A continuación, puede hacer que el Servicio engendre un hilo de fondo para cada actividad que se enlaza a él.

+3

@JoakimEngstrom ¿por qué no lo editaste para que quede más claro? – SMT

Cuestiones relacionadas