2015-08-10 11 views
7

Ich versuche, eine Android-Bibliothek mit einem einfachen Dienst zu erstellen. Zum Beispiel:Android externer Dienst aus einer Bibliothek (AAR, nicht Shared Service)

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

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

ich starten Sie den Dienst folgendermaßen:

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

Der Dienst wird in eine AAR-Datei kompiliert und nach dem Hinzufügen, dass zu einer Anwendung ich eine ClassNotFoundException bekommen.

Ich muss keinen Dienst binden, da die Anwendung nicht mit dem Dienst kommunizieren muss. Ich brauche auch keine Hilfe-Schnittstelle, da ich den Dienst nicht mit anderen Apps teilen möchte. Ich weiß, ich brauche den Dienst auf der Anwendungsseite zu erklären (nicht-Bibliothek), so habe ich, dass die folgende Art und Weise:

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

Dies ist das Manifest meiner Bibliothek ist:

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

ich getan habe etwas Recherche bei Stackoverflow/Google und ich konnte keine Antwort auf mein Problem finden.

Android service in library

auch versucht, verschiedene Möglichkeiten, den Dienst starten (auf Aktion usw.), aber nicht gut so weit.

Alle Hilfe ist willkommen und ich entschuldige mich, wenn ich eine böse doppelte Frage gestellt habe.

+1

Es gibt einen Konflikt zwischen Ihrem Klassennamen 'BasicService' und dem Dienst, den Sie tatsächlich' SimpleService' starten. Könnte das das Problem sein? Habe das gerade in einem Test Repo versucht und scheint gut zu funktionieren. Ich erkläre den Dienst nicht im Manifest meiner Bibliothek, aber ich erkläre ihn im Manifest meiner Bewerbung. Ich starte den Dienst auf genau die gleiche Weise wie Sie und schließe die Bibliothek über eine lokale aar ein. –

+0

Hallo jmols, das war ein Fehler bei der Anonymisierung des Problems. Außerdem wurde das Manifest der Bibliotheken hinzugefügt. Hoffe du kannst helfen :) – jobbert

+0

Dein Code scheint mir richtig zu sein. Autocomplete funktioniert richtig? (Auf diese Weise sind wir sicher, dass die Abhängigkeit korrekt enthalten ist.) Welche Version des Gradle-Plugins verwenden Sie? Ich benutze 'com.android.tools.build: grandle: 1.3.0'. –

Antwort

5

Der BaseService implementierte eine Schnittstelle von einer anderen Bibliothek, die nicht mit der aar-Datei gepackt wurde. Dies führte zum Absturz der Anwendung direkt nach dem Start auf einem Gerät, da die Abhängigkeit nicht aufgelöst werden konnte.

public class BaseService implements OtherLibraryInterface { 
    ... 
} 

Statt eine ClassNotFoundException für die OtherLibraryInterface zu werfen, würde Android werfen genau diese Ausnahme für die BaseService. Das ist sehr verwirrend und lässt uns glauben, dass etwas mit dem Service nicht stimmt.

Das Hinzufügen der OtherLibrary-Abhängigkeit explizit als eine Abhängigkeit zu der Hauptanwendung löste dieses Problem.

+1

Mein Tag gerettet. Vielen Dank! – tarkeshwar

Verwandte Themen