¿Servicio compartido de Android?

En primer lugar me gustaría decir dos cosas. La primera vez, disculpe si ya se ha hecho esta pregunta, busqué preguntas similares sobre este tema pero no pude encontrar una solución. En segundo lugar, perdón por la larga pregunta y, por favor, avíseme de cualquier error y me aseguraré de hacer los cambios apropiados :).

Soy relativamente nuevo en el desarrollo de Android (aproximadamente 2 meses), así que perdona mi ignorancia. La pregunta que tengo es sobre el servicio de Android.

Mi problema es el siguiente, he creado las siguientes 3 aplicaciones:

  • Una biblioteca de Android que contiene un pequeño servicio de prueba ( myService ).
  • Una aplicación ( TestApplicationOne ) que tiene acceso a la biblioteca de Android.
  • Otra aplicación ( TestApplicationTwo ) que también tiene acceso a la biblioteca de Android.

Mi solución actual funciona de la siguiente manera, TestApplicationOne hace referencia a la biblioteca personalizada y utiliza esta biblioteca para conectarse al servicio ( myService ) a través del método bindService () . Luego de una conexión exitosa, la aplicación se agrega a una colección de observadores ubicados dentro de myService . Cada objeto en esta colección es notificado cada vez que el servicio necesita transmitir un mensaje.

Cuando se ejecutó, la solución anterior parecía funcionar bien. Sin embargo, ahora tengo otra aplicación ( TestApplicationTwo ) que también quisiera usar el mismo servicio que el anterior. La implementación de TestApplicationTwo se creó para el mismo funcionamiento / especificación de la primera aplicación ( TestApplicationOne ).

El problema que tengo es que cuando el servicio se inicia en cualquiera de las aplicaciones, la otra aplicación no recibe notificación de ningún evento.

He tratado de implementar varios enfoques para resolver esto. Como usar el patrón Singleton para retener una sola instancia, pero el problema todavía parece existir. Mi única comprensión de esto es que cada vez que se inicia una de las aplicaciones, se crea una nueva instancia de la biblioteca. Por lo tanto, la biblioteca a la que se hace referencia en TestApplicationOne no es la misma instancia que la biblioteca a la que se hace referencia en TestApplicationTwo , y como resultado, no se le notifica.

¿Hay alguien con alguna experiencia en este tema? ¿O puede pensar en alguna posible solución?

Gracias de antemano por cualquier ayuda, es muy apreciado.

John

El problema que tengo es que cuando el servicio se inicia en cualquiera de las aplicaciones, la otra aplicación no recibe notificación de ningún evento.

Eso es porque tienes dos servicios. El hecho de que el servicio esté empaquetado en un proyecto de la biblioteca de Android no hace que, de alguna manera mágica, dos aplicaciones distintas utilicen la misma copia.

Como usar el patrón Singleton para retener una sola instancia, pero el problema todavía parece existir.

Ambas aplicaciones se ejecutan en procesos separados, con su propia copia privada del servicio.

Mi única comprensión de esto es que cada vez que se inicia una de las aplicaciones, se crea una nueva instancia de la biblioteca.

Las bibliotecas no tienen instancias. Los proyectos de bibliotecas de Android no son DLL, son más parecidos a bibliotecas estáticas.

Por lo tanto, la biblioteca a la que se hace referencia en TestApplicationOne no es la misma instancia que la biblioteca a la que se hace referencia en TestApplicationTwo, y como resultado, no se le notifica.

Más exactamente, el servicio en TestApplicationOne es una copia separada del servicio de la copia en TestApplicationTwo .

¿O puede pensar en alguna posible solución?

No tengo dos aplicaciones separadas.

O bien, rediseñe sus aplicaciones de modo que solo una tenga el servicio y la otra use el servicio desde la primera aplicación.

O bien, tenga el servicio deshabilitado en el manifiesto en ambas aplicaciones, exportado con un estable (por ejemplo, con una cadena de acción personalizada). La primera aplicación que se instala / ejecuta utiliza PackageManager para ver si existe el servicio (por ejemplo, no es realmente la primera aplicación). Al ver que el servicio no existe, habilita su propia copia de ese servicio. Luego, la segunda aplicación pasa por el mismo proceso, ve que el servicio ya está allí y usa la copia remota en lugar de habilitar la suya propia.

Ni el segundo ni el tercero son muy fáciles, simplemente porque los datos solo existen en una aplicación (la que tiene el servicio). Por lo tanto, si esa aplicación se desinstala, la otra se atornilla, incluso si tiene el código de servicio disponible como un componente deshabilitado. Si las aplicaciones se describen claramente al usuario como que tienen una relación primaria / secundaria (por ejemplo, la aplicación y su complemento), entonces esto puede funcionar. Es de esperar que los usuarios no esperen que funcione un complemento si la aplicación no está allí. por ejemplo. Por supuesto, en este caso, el complemento no tendría su propia copia del servicio en primer lugar, pero siempre buscaría eso en la aplicación principal.

No estoy seguro, pero creo que el atributo de la etiqueta de servicio de android:singleUser="true" podría ser lo que está buscando.

 If set to true, a single instance of this component will run for all users. [boolean] 

Si esto no ayuda, entonces podría considerar una solución en la que envíe Difusiones desde el servicio para cada uno de sus eventos y tenga BroadcastRecievers en sus 2 aplicaciones en lugar de acceder al servicio como un objeto …