2012-03-05 12 views
5

En mi aplicación que he diseñado para tener un servicio que obtiene datos constantemente (por una buena razón, es de unos sensores) y le proporciona a dos clientes:¿Debo extender la clase Binder o usar un Messenger?

  • Una actividad de la interfaz de usuario para mostrar los datos en vivo
  • Otro servicio que registra los datos

En cualquier momento, los dos, uno o ninguno de estos clientes pueden estar ejecutándose.

Creo que este servicio debe ser un servicio de Bound, mientras que el servicio de inicio de sesión es un servicio de inicio.

El documentation de Android dice que debo extender la clase Binder o utilizar un Messenger si deseo acceder al servicio desde otro proceso.

Este servicio, el servicio de registro y la Actividad de UI estarán todos en la misma aplicación, por lo que presumiblemente estarán en el mismo proceso, pero ¿cuál será la mejor solución aquí? Sospecho que la documentación podría no tener en cuenta la posibilidad de que pueda tener dos clientes en el mismo proceso que el servicio.

Gracias

Respuesta

-1

La solución preferida de imrankhan (Binder) parecía funcionar, pero al final opté por un Messenger porque en la práctica encontré esta solución más flexible y lógica de codificar.

9

El androide documentation dice claramente
Ampliación de la clase Carpeta
Si el servicio es privado para su propia aplicación y se ejecuta en el mismo proceso que el cliente (que es común), debe crear su interfaz ampliando la clase Binder y devolviendo una instancia desde onBind(). El cliente recibe el Binder y puede usarlo para acceder directamente a los métodos públicos disponibles en la implementación de Binder o incluso en el Servicio. Esta es la técnica preferida cuando su servicio es simplemente un trabajador de segundo plano para su propia aplicación. La única razón por la que no crearía su interfaz de esta manera es porque su servicio es utilizado por otras aplicaciones o en procesos separados.

El uso de un mensajero
Si necesita que su interfaz para trabajar a través de diferentes procesos, puede crear una interfaz para el servicio con un mensajero. De esta manera, el servicio define un controlador que responde a diferentes tipos de objetos de mensaje. Este Handler es la base de un Messenger que luego puede compartir un IBinder con el cliente, lo que permite al cliente enviar comandos al servicio utilizando objetos Message. Además, el cliente puede definir un Messenger propio para que el servicio pueda enviar mensajes de regreso. Esta es la forma más sencilla de realizar comunicación entre procesos (IPC), ya que Messenger pone en cola todas las solicitudes en un solo subproceso para que no tenga que diseñar su servicio para que sea seguro para subprocesos.

Entonces, la mejor opción es usar un servicio extendiendo la clase IBinder cuando este servicio es un servicio local. Cuando ambos servicios se crean usando Messenger y AIDL, son servicios remotos.

+0

¿Va a funcionar tanto con el Servicio como con la Actividad como clientes al mismo tiempo? – CNorris

+0

sí funciona para ambos y el sistema entrega el mismo 'IBinder' a todos los clientes –