2009-05-28 11 views
5

He estado trabajando con Android durante más de un año, pero todavía tengo problemas para determinar cuándo se deben usar diferentes tipos de mensajes/comunicación entre procesos/hilos. Me refiero principalmente a la transmisión de Intentos, usando AIDL para services, usando Manejadores para enviar mensajes y comunicación de socket.¿Cuándo debería usar cada uno de los diferentes tipos de mensajes de Android?

Muchas de estas herramientas se pueden utilizar para realizar tareas similares, pero ¿cuál se adapta mejor a situaciones particulares?

Respuesta

14

Esta es una pregunta bastante abierta, pero permítanme intentar describir cómo veo que la comunicación de aplicación intra/inter funciona mejor.

Uno de los aspectos clave de los mensajes de Android es el concepto de que todos los componentes de la aplicación están poco vinculados. Debido a que todas las aplicaciones se ejecutan en un proceso separado, y una 'aplicación' puede consistir en varias aplicaciones (responsables de proporcionar diferentes actividades o servicios), las técnicas de mensajería se basan en la idea de organizar los mensajes a través de los límites del proceso.

Intentos

La técnica preferida para la mensajería, siempre intenta utilizar un Intención siempre que sea posible. Es la forma más "nativa" de transferir mensajes dentro de Android.

Ventajas

Usando Intentos para mensajería mantiene la unión flexible de componentes de la aplicación, lo que le permite transferir mensajes sin problemas entre varias aplicaciones. Las intenciones se utilizan en gran medida dentro del sistema central para iniciar actividades y servicios, y para transmitir y recibir eventos del sistema.

Usando extras Bundles puede incluir pares clave/valor de primitivas como datos de carga dentro de Intents para pasar fácilmente información de un componente de aplicación a otro, incluso si esos componentes se ejecutan en procesos diferentes.

Desventajas

Debido Intentos están diseñados para ir entre los procesos, la carga útil de extras sólo es compatible con los tipos primitivos. Si necesita enviar un objeto usando un Intento, tendrá que deconstruirlo en primitivas en un extremo y reconstruirlo en el otro.

clase de aplicación

Si sólo desea comunicarse dentro de una sola aplicación que se ejecuta en un solo proceso se trata de una solución práctica.

Ventajas

extendiendo la clase Application (e implementarlo como un Singleton) se obtiene un objeto que va a existir siempre existe cualquiera de sus componentes de la aplicación, proporcionando un lugar centralizado para almacenar y transferir datos objeto complejo entre los componentes de la aplicación.

Desventajas

Esta técnica limita su programa de mensajería a los componentes dentro de una sola aplicación.

Servicio de Encuadernación, IPC, y AIDL

La unión a un servicio le permite acceder a sus métodos y objetos de intercambio con él. AIDL es una forma de definir cómo serializar un objeto en las primitivas del sistema operativo para que pueda organizarse a lo largo de los límites del proceso si el servicio al que se está vinculando se está ejecutando en una aplicación separada.

Ventajas

Cuando se enlaza a un servicio que tiene acceso a ella como si fuera un objeto dentro de la clase de llamadas. Eso significa que puede ejecutar métodos en el Servicio e intercambiar objetos enriquecidos con él.

Tenga en cuenta que si se une a un Servicio en un proceso de aplicación diferente, deberá crear las definiciones AIDL que le dicen a Android cómo seralizar/deserializar los objetos que desea pasar entre las aplicaciones.

Desventajas

Creación de las clases AIDL para IPC es un poco de trabajo extra, y vinculante crea dependencias adicionales entre los servicios y actividades que pueden hacer que sea más difícil para el kernel para limpiar los recursos cuando otras aplicaciones están siendo famélico.

Sin embargo, la asignación de mensajes a través de los límites del proceso es costosa. Por lo tanto, si no está ejecutando métodos en un servicio, el uso de vinculante e IPC probablemente sea excesivo; vea si puede lograr lo mismo usando Intenciones.

sockets

Si va a recurrir a los sockets para comunicarse dentro o entre aplicaciones que se ejecutan en un solo dispositivo, que es ya sea porque no hay otra manera o te has perdido un truco en alguna parte. Si sus mensajes abandonan el dispositivo, los enchufes son una alternativa buena, rápida. Si te estás quedando en el dispositivo, las posibilidades son Intents o IPC va a ser una mejor opción.

+0

+1 esta es una respuesta ideal que se puede utilizar como una respuesta estándar en toda la comunidad ..... – aProgrammer

1

Mis 2 centavos

  • No he utilizado sockets locales. Parece exagerado ya que tiene que generar y analizar los datos.
  • Intentos son para cualquiera de las cosas que otros aplicaciones que desee hacer (lanzamiento mí en una ventana de redacción o para recoger algo fuera)
  • AIDL/los paquetes/manejadores para tener una charla interfaz gráfica de usuario a un proceso sin cabeza que se ejecuta constantemente. Dependiendo de la aplicación puede ocurrir una gran cantidad de la transferencia de datos reales utilizando un proveedor de contenido , pero tiendo a tener algunos datos que deben transferirse fuera del de ese canal.
2

Todo depende del caso de uso y el tipo de su aplicación.Si la aplicación se ejecuta todo el tiempo mejor para ir con el enfoque AIDL, ya que es la forma más segura de comunicarse. Si la aplicación no necesita ejecutarse todo el tiempo, puede ir con intención de transmisión o con intención pendiente para comunicarse entre aplicaciones.

Cuestiones relacionadas