Servicio externo de Android desde una biblioteca (AAR, no Shared Service)
Estoy intentando crear una Biblioteca de Android que contenga un servicio sencillo. Por ejemplo:
public class BasicService extends Service { public BasicService() { Log.d("I", "work"); } @Override public IBinder onBind(Intent intent) { return null; } }
Comienzo el servicio de la siguiente manera:
- AlarmManager dentro de BroadcastReceiver cuando BOOT_COMPLETED
- Cómo obtener datos de un servicio sin consolidar en Android
- Servicio, WakeLock
- Android: ¿puedo usar Google Analytics dentro de un servicio?
- "Service MeasurementBrokerService está en uso" está mostrando en mi proceso de solicitud
startService(new Intent(this, BasicService.class));
El servicio se compila en un archivo AAR y después de añadir que a una aplicación obtengo un ClassNotFoundException.
Caused by: java.lang.ClassNotFoundException: Didn't find class "nl.company.example.library.Services.BasicService" on path: DexPathList[[zip file "/data/app/nl.example.aartest-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
No necesito vincular un servicio ya que la aplicación no tiene que comunicarse con el servicio. Tampoco necesito una interfaz de ayuda, ya que no quiero compartir el servicio con otras aplicaciones. Sé que necesito declarar el servicio en el lado de la aplicación (no la biblioteca) así que hice eso la manera siguiente:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="nl.company.example.exampleApp" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="19" /> <application android:settings... > <service android:name="nl.company.example.library.Services.BasicService" android:enabled="true" android:exported="true" /> </application> </manifest>
Este es el manifiesto de mi biblioteca:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="nl.company.example.library" > <application/> </manifest>
He hecho algunas investigaciones en Stackoverflow / Google y no pude encontrar una respuesta a mi problema.
Servicio de Android en la biblioteca
También probamos diferentes maneras de comenzar el servicio (en acción, etc.) pero no es bueno hasta ahora.
Toda la ayuda es bienvenida y mis disculpas si hice una pregunta duplicada mal.
- PhoneStateListener onSignalStrengthsChanged deja de ser llamado en Service
- Cómo detener / iniciar un servicio que contiene un bucle infinito en la creación
- BroadcastReceiver vs Servicio
- El servicio de inicio de Android nunca empieza
- ¿Cómo actualizar SeekBar de MediaPlayer en funcionamiento?
- Uso de GoogleApiClient en un servicio
- ¿Cómo inicio un servicio que se define en un paquete diferente?
- Actualizar MusicPlayer SeekBar en servicio
El BaseService implementaba una interfaz de otra biblioteca que no estaba empaquetada con el archivo aar
. Esto provocó que la aplicación se bloquee inmediatamente después de iniciar un dispositivo, ya que no pudo resolver la dependencia.
public class BaseService implements OtherLibraryInterface { ... }
En lugar de lanzar un ClassNotFoundException
para el OtherLibraryInterface
, Android lanzaría exactamente esa excepción para el BaseService
. Lo cual es muy confuso y nos lleva a creer que hay algo mal con el Servicio.
Agregar la dependencia OtherLibrary explícitamente como una dependencia a la aplicación principal resolvió este problema.
- SingleTask launchMode en android no funciona
- Cambiar el tamaño de los diseños de forma programática (como animación) hasta "wrap_content"