studio - manual de programacion android pdf
¿Arquitectura de complementos para una aplicación de Android? (3)
ESTA PREGUNTA SE HA MOVIDO A https://softwarerecs.stackexchange.com/questions/27841/plugins-architecture-for-an-android-app
Quiero implementar un sistema de complementos para una aplicación de código abierto , porque se ha vuelto realmente grande, con muchas características que solo necesitan unos pocos usuarios. Liberar diferentes aplicaciones no es una buena solución, porque userA quiere feature7 y feature24, mientras que userB quiere feature39 y feature24.
¿Dónde puedo encontrar un buen ejemplo de una arquitectura de complemento?
Esto es lo que me gustaría que un complemento pueda hacer:
- Redefinir el diseño de una pantalla en particular ( cargar XML desinflado ?)
- Redefinir un método de una clase ( load dex class ?, AOP ?)
Por ejemplo, uno de los complementos debe agregar un botón en una pantalla en particular, y al hacer clic en este botón se incrementa un valor en la base de datos de la aplicación. Esto no es factible con los Proveedores de Contenido y las Intenciones, hasta donde yo sé.
Quiero evitar que el código de la aplicación principal sea complejo con toneladas de anzuelos en todas partes.
La forma del complemento podría ser un archivo en la tarjeta SD, una aplicación o cualquier otra cosa.
¿Dónde puedo encontrar un buen ejemplo de una arquitectura de complemento?
Roman Nurik de Google ha implementado un buen marco de complementos en su reloj de tablero de aplicaciones de código abierto. Los plugins son servicios que extienden la clase DashClockExtension en la API y se instalan como archivos APK completamente independientes con sus propios recursos. Trabajar mucho definiendo el protocolo de comunicación a través de AIDL, pero es agradable y limpio, y funciona muy bien.
uno de los complementos debe agregar un botón en una pantalla en particular, y al hacer clic en este botón se incrementa un valor en la base de datos de la aplicación.
Las partes del diseño principal que pueden ser modificadas por el complemento necesitarán ser predefinidas por la aplicación central y expuestas a través del protocolo de comunicación. El plugin debería poder inflar un diseño arbitrario y enviarlo a la aplicación principal, lo que podría colocarlo dentro de un área preasignada de su propio diseño.
He hecho un framework que funciona como Robo-guice con algunas de sus principales funciones de IoC. (Reduzca los códigos repetitivos que cargan vistas / servicio, etc.)
Pero el núcleo de lo que creo que es la solución a su problema es la capacidad de cargar archivos de "complementos" de APK por separado, que incluyen archivos "res" y <layouts>.xml
. El archivo <layouts>.xml
se puede inflar independientemente por las clases dentro de ese APK. Es decir, puede cargar un CustomView (que infla su propio <layout>.xml
) en una aplicación originaria / principal. Todo esto se hace sin el APK de la aplicación principal sabiendo cómo se ha inflado la interfaz de usuario en el complemento APK.
Ejemplo de lo que quiero decir: tengo una aplicación de mapeo, el marco escaneará dinámicamente el APK instalado que coincide con el "contrato" para un complemento de "función complementaria" y cargará la interfaz de usuario específica en la vista de la aplicación como un panel flotante .
Yo diría que un marco de plugins para Android es factible, ya que Android tiene la mayoría, si no todas las API integradas necesarias para lograr esto.
Estos son tus amigos en esta área de desarrollo de complementos para Android:
- PackageManager (Escanear paquetes de instalación, también conocidos como Complementos)
-
DexClassLoader
(ClassNotFoundException
será un problema si no usas elClassLoader
correcto por cierto) - Reflexión de Java
Si solo desea aumentar la modularidad, le recomendaría usar un contenedor de inyección de dependencia como PicoContainer , Guice o Spring .
Si desea una arquitectura plug-in liviana, vaya a Java Plugin Framework (JPF) .
Le permite definir puntos de extensión, que pueden ser implementados por sus módulos. El trabajo principal del marco de plugins es proporcionar una forma de agrupar estos módulos (como jars), que se encuentran dinámicamente en la aplicación central y se proporcionan como implementaciones del punto de extensión.