2015-08-10 29 views
7

Próbuję utworzyć bibliotekę Android zawierającą prostą usługę. Na przykład:Usługa zewnętrzna Android z biblioteki (AAR, nie wspólna usługa)

public class BasicService extends Service { 
    public BasicService() { 
     Log.d("I", "work"); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 
} 

ja uruchomić usługę w następujący sposób:

startService(new Intent(this, BasicService.class)); 

Usługa jest kompilowany do pliku AAR i po dodaniu do wniosku, że mogę dostać 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]] 

Nie muszę wiązać usługi, ponieważ aplikacja nie musi komunikować się z usługą. Nie potrzebuję też interfejsu pomocy, ponieważ nie chcę udostępniać usługi innym aplikacjom. Wiem, że muszę zadeklarować usługę z boku aplikacji (nie biblioteki), więc zrobiłem to w następujący sposób:

<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> 

To manifest mojej bibliotece:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="nl.company.example.library" > 
    <application/> 
</manifest> 

Robiłem niektóre badania w Stackoverflow/Google i nie byłem w stanie znaleźć odpowiedzi na mój problem.

Android service in library

próbował także różne sposoby uruchamiania usługi (w sprawie działania etc.), ale nie jest dobre do tej pory.

Cała pomoc jest mile widziana i przepraszam, jeśli zrobiłem zadane zła pytanie.

+1

Istnieje niezgodność między twoją nazwą klasy "BasicService" a usługą, którą faktycznie uruchamiasz 'SimpleService'. Czy to może być problem? Próbowałem tego w repozytorium testowym i wygląda na to, że działa dobrze. Nie deklaruję usługi w manifeście mojej biblioteki, ale deklaruję ją w manifeście mojej aplikacji. Uruchamiam usługę w dokładnie taki sam sposób jak ty i włączasz bibliotekę za pośrednictwem lokalnego interfejsu. –

+0

Witaj jmols, przepraszam, że pomyłkę sprawiłam, że problem był anonimowy. Dodano także manifest biblioteki. Mam nadzieję, że jesteś w stanie pomóc :) – jobbert

+0

Twój kod wydaje mi się poprawny. Autouzupełnianie działa poprawnie? (W ten sposób jesteśmy pewni, że zależność jest zawarta poprawnie.) Jakiej wersji wtyczki Gradle używasz? Używam 'com.android.tools.build: gradle: 1.3.0'. –

Odpowiedz

5

BaseService implementował interfejs z innej biblioteki, która nie była spakowana z plikiem aar. Spowoduje to awarię aplikacji zaraz po uruchomieniu urządzenia, ponieważ nie może ona rozwiązać zależności.

public class BaseService implements OtherLibraryInterface { 
    ... 
} 

Zamiast rzucania ClassNotFoundException dla OtherLibraryInterface, Android rzucał dokładnie ten wyjątek dla BaseService. Co jest bardzo mylące i prowadzi nas do przekonania, że ​​coś jest nie tak z Usługą.

Dodawanie zależności OtherLibrary jawnie jako zależności od głównej aplikacji rozwiązało ten problem.

+1

Uratowałem mój dzień. Dzięki! – tarkeshwar