2011-04-22 7 views
11

Soy muy nuevo en el desarrollo de Java y Android y para aprender estoy tratando de comenzar con una aplicación para reunir estadísticas e información como munin. Estoy tratando de poder cargar "complementos" en mi aplicación. Estos complementos ya están en la aplicación, pero no quiero tener que invocarlos todos por separado, pero ser capaz de iterar sobre ellos. Estaba intentando utilizar el cargador de servicios, pero nunca pude obtener los servicios META-INF/en mi apk. Así que me pregunto si es posible utilizar serviceloader en android Gracias
EDIT: Estoy preguntando acerca de java.util.ServiceLoader, creo que debería, pero no puedo encontrar la forma de obtener mi carpeta de servicios en META- INF en la apkUsar serviceloader en android

+0

Ayudaría que tuviéramos alguna idea de lo que es "serviceloader". – CommonsWare

+0

Pregunto por java.util.ServiceLoader, creo que debería hacerlo, pero no puedo encontrar la forma de obtener mi carpeta de servicios en META-INF en la apk – silverchris

+0

Estoy intentando esto por mí mismo, y encontré a [esta persona ] (http://groups.google.com/group/android-developers/browse_thread/thread/ba98351e50897499/2c96aecee4ece3d0) quien ha logrado hacerlo, desafortunadamente, tiene poca información sobre los detalles. He pedido más información y si él me responde, me aseguraré de hacértelo saber :) – SubmittedDenied

Respuesta

2

Es posible. Es posible que desee comprobar http://developer.android.com/reference/java/util/ServiceLoader.html

+3

¿Sabes cómo obtener los servicios de META-INF en la apk? Lo he intentado durante horas y siempre parece estar excluido. Estoy usando eclipse para escribir y construir el programa – silverchris

+1

AFAIK su única opción es usar un script Ant después de la creación del apk, e insertar la carpeta META-INF usando la tarea jar. –

+0

Eche un vistazo a esta [respuesta] (http://stackoverflow.com/a/17066147/731183) – AlexS

-3

ServiceLoader es material del lenguaje Java que no es realmente relevante en Android. Recomiendo no usarlo. Si solo desea encontrar una lista de clases dentro de su .apk para cargar, hay todo tipo de formas de hacerlo: coloque el archivo XMl en res/xml que las liste, use reflejo, anotaciones, etc.

+0

Tengo problemas para encontrar mucha información sobre cualquiera de los métodos que sugirió para cargar los "complementos" sin que yo especificara cada uno de ellos correr a mano. Realmente podría usar un buen enlace o ejemplo porque soy un importante nova de Java Gracias – silverchris

+11

La clase ServiceLoader está incluida en Android API nivel 9 por lo que es relevante. Incluir la lista de clases de implementación en un archivo de recursos no funcionará, ya que necesita entrar en un archivo denominado 'META-INF/services/' en el APK. – SubmittedDenied

4

La carpeta META-INF está deliberadamente excluida del APK por ApkBuilder; el único comentario en ApkBuilder.java es "tenemos que excluir alguna otra carpeta (como/META-INF)" pero no hay otra explicación.

Incluso después de agregar META-INF con hormiga, aún tendrá problemas si quiere usar Proguard, que se niega a reemplazar el contenido de META-INF/services/* o cambiarle el nombre (esa es otra historia, la el autor quiere mantener a Proguard agnóstico).

Sin embargo, las personas que usan maven pueden querer comprobar https://github.com/pa314159/maven-android-plugin (la rama llamada "modificada"), que intenta resolver ambos problemas. Es un fork del original "android-maven-plugin" que modifiqué hace un mes para mis propios proyectos de Android.

También proporciona un parche para la esperanza Proguard-4,7

esto ayuda, cualquier comentario es bienvenido.

+1

Funciona con Gradle: https://code.google.com/p/android/issues/detail?id=59658 – TJR

2

He encontrado una solución que puede funcionar en algunas situaciones. En lugar de ServiceLoader, estoy usando la clase/biblioteca org.openide.util.Lookup que viene con NetBeans: es un superconjunto de ServiceLoader. No requiere NetBeans y parece funcionar bien con Eclipse. Es necesario reemplazar cualquier funcionalidad ServiceLoader que esté utilizando en su aplicación con equivalentes de búsqueda, y agregar la biblioteca org-openide-util-searchup. Entonces, sólo puede hacer algo como esto:

Lookup lookup = new ProxyLookup(Lookup.getDefault(), 
       Lookups.metaInfServices(myClass.getClassLoader(), "services/")); 

y mover los archivos de ServiceLoader META-INF/services/a los servicios /.

Tenga en cuenta que, debido a ProxyLookup, esto seguirá funcionando sin cambios en los entornos de Java estándar (es decir, en esos casos, seguirá buscando en META-INF/services).

Aquí hay un enlace a la documentación de la biblioteca: http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/lookup/Lookups.html

ACTUALIZACIÓN

Después de trabajar con esto por un par de días, que parece funcionar bien - me muevo entre los ambientes (estándar de Java y Android) y funciona correctamente en cada ubicación. La desventaja principal es tener que copiar manualmente los archivos al directorio/services.

+0

La búsqueda es relevante para Java, no para Android. Esto continuará funcionando en entornos Java estándar sin cambios. , no Android –

+0

No, Lookup funciona en Android, solo tiene que incluir el archivo jar de la biblioteca (org-openide-util-lookup.jar) en la aplicación. Mi punto fue que el código que incluí funciona correctamente en entornos Android y estándar de Java debido al aspecto Proxy. – djilk