¿Cómo ejecutar un servicio singleton (compartido) en una biblioteca para múltiples aplicaciones?

He escrito una biblioteca que inicia un servicio en segundo plano. Funciona perfectamente en todas las aplicaciones.

Con el fin de reducir el uso de memoria RAM, quiero evitar ejecutar varios servicios para diferentes aplicaciones. En realidad, es bastante suficiente para usar sólo un servicio para hacer las cosas.

En primer lugar, he escrito un archivo AIDL para hacer IPC entre aplicaciones / librerías. Definió el servicio como exportado / habilitado con permiso de firma. Dado que todas las aplicaciones son exactamente el mismo servicio, no es posible comprobar si alguien está arriba o abajo. Al enlazar el servicio para comprobar el estado del servicio, siempre crea y destruye el propio servicio debido a la naturaleza del indicador BIND_AUTO_CREATE. Es por eso que no es posible obtener cualquier tipo de información del servicio exportado si realmente está funcionando.

Entonces, traté de definir un proveedor de contenido para el manifiesto de la biblioteca. Mi objetivo es compartir la información de servicio a través de ella. Es un mecanismo muy bueno para comunicarse entre el servicio exportado y el proceso principal de la aplicación. Pero no es utilizable para múltiples instancias. Dado que las aplicaciones que obtienen la información del proveedor de contenido de la biblioteca utilizan la misma autoridad y, por lo tanto, no es posible instalar la segunda. Da un error DUPLICATE_PROVIDER_AUTHORITY.

¿Cuál es su sugerencia sobre el tema? ¿Existe alguna opción para crear un mecanismo maestro / esclavo? ¿Es posible hacer que el singleton de servicio para la aplicación use el proyecto de biblioteca?

PS: Técnicas probadas de difusión y preferencias compartidas. Pero no son eficaces para escuchar la devolución de llamada del servicio exportado.

Necesitas poner el Service en un APK propio. Necesita tener su propio nombre de paquete único (en el manifiesto) que es diferente de los nombres de paquetes de cualquiera de las aplicaciones que lo utilizan. Así es como usted hace que el Service comporte como un singleton. Ahora puede utilizar AIDL y enlazar con el Service para tener comunicación bidireccional.

Tenga en cuenta que en las versiones más recientes de Android, se ha convertido en necesario iniciar un Service mediante un Intent explícito (es decir: el Component debe especificarse explícitamente, no puede utilizar sólo una acción).

Alternativa 1:

  • Si el caso de uso lo permite, creo que no debería implementar el Servicio. Haga que su cliente implemente un servicio una llamada su código de biblioteca. Así es como funcionan MediaPlayer y otras APIs predeterminadas de android.

Alternativa 2:

  • Aloje el servicio en una aplicación independiente … y descargue la aplicación cuando se realice la primera llamada desde cualquier cliente. De aquí en adelante habrá servicio único que maneja toda la petición del cliente. Éste es cómo algunas APIs como las soluciones del aire / MDM del adobe de Airwatch trabajan.

No hay una buena manera de controlar un componente que se ejecuta en otra aplicación, a menos que utilice receptores de difusión y todo.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.