it-swarm.com.de

onServiceConnected wurde niemals nach der bindService-Methode aufgerufen

Ich habe eine bestimmte Situation: Ein von einem Rundfunkempfänger gestarteter Dienst startet eine Aktivität. Ich möchte, dass diese Aktivität wieder mit dem Dienst kommuniziert. Ich habe mich für AIDL entschieden, um dies zu ermöglichen. Alles scheint gut zu funktionieren, mit Ausnahme der bindService()-Methode, die in onCreate() der Aktivität aufgerufen wird. bindService () löst tatsächlich eine Nullzeiger-Ausnahme aus, da onServiceConnected() nie aufgerufen wird, während die onBind()-Methode des Dienstes ist. Wie auch immer, bindService() gibt true zurück. Der Dienst ist offensichtlich aktiv, weil er die Aktivität startet. Ich weiß, dass das Aufrufen einer Aktivität von einem Dienst sich als seltsam anhören kann, aber leider ist dies die einzige Möglichkeit, die Spracherkennung in einem Dienst zu nutzen.

Danke im Voraus 

31
Matroska

Ich kann das genaue Problem nicht aus Ihrer Beschreibung herausfinden, also werde ich hier raten!

Wie kann bindService() eine NullPointerException werfen? Dies könnte (/ sollte) nur möglich sein, wenn Sie keine Service oder einen ServiceConnection Listener angeben. 

bindService() kann keine NullPointerExceptionwerfen, daonServiceConnected() nicht aufgerufen wird. Der Aufruf von onServiceConnected() ist ein Produkt von bindService().

Ich nehme an, Sie rufen eine AIDL-Methode auf, bevor die Service tatsächlich gebunden ist.

13
MrSnowflake

Ich habe gerade eine andere Version dieses Problems erlebt, mit dem gleichen Symptom, dass onServiceConnected(...) nicht aufgerufen wird. Die Ursache war in meinem Fall anders.

Sie müssen sicherstellen, dass in Ihrer AndroidManifest.xml im Anwendungs-Tag eine Dienstdeklaration enthalten ist - dies war für mich der Grund des Problems.

<application Android:name=".YourAppTitle" Android:icon="@drawable/icon" Android:label="@string/app_name">
    <activity Android:name=".Main" Android:label="@string/app_name">
    </activity>
    <service Android:name="YourService" />
</application>

Wenn Sie eine separate Android-Bibliothek in Eclipse verwenden, ist dies noch komplizierter. Das Hinzufügen dieses Service-Tags scheint das Problem nur zu beheben, wenn der referenzierte Dienst im selben Paket wie das Manifest ist. Wenn sich Ihre App im Paket a.b.c befindet und sich AndroidManifest.xml hier befindet, muss "YourService" ebenfalls im Paket a.b.c. sein. (ggf. manuell aus einer anderen Bibliothek kopiert) oder der Tag <service..> wird möglicherweise ignoriert und onServiceConnected(...) wird immer noch nicht aufgerufen.

Dies war bei meinem Projekt der Fall, obwohl ich in meinem Code eine geeignete Importanweisung für den Dienst verwendet habe. Eclipse zeigte keinen Fehler an, sodass der Import die Klasse aus einer anderen Bibliothek im Eclipse-Arbeitsbereich richtig identifizierte.

HTH

45
KomodoDave

Nach stundenlangen Versuchen, dies herauszufinden, besteht das Problem darin, dass die Beispiele, die die Erstellung des Dienstes veranschaulichen, die onBind-Methode nicht enthalten oder über den folgenden Beispielcode verfügen oder diesen für Sie generieren:

public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

Dies führt dazu, dass die onServiceConnected-Methode fehlschlägt oder nie ausgeführt wird. Das Update ist sehr einfach, das Folgende ist:

public IBinder onBind(Intent intent) {
    return mBinder;
}

Wo könnten Sie eine einfache Sammelmappe wie die folgende erstellen, um zurückzukehren:

private final IBinder mBinder = new LocalBinder();
public class LocalBinder extends Binder {
    public ConferenceService getService() {
    return ConferenceService.this;
  }
}
40
Brad Brown

Das Ereignis onServiceConnected wurde in meiner Anwendung nie aufgerufen.

Das Problem war, dass ich den Dienstnamen in meinem Anwendungsmanifest definiert hatte als:

<service Android:name="MyService" Android:enabled="true"></service>

Nachdem ich es in den vollständigen Klassennamen geändert hatte, funktionierte es:

<service Android:name="com.example.MyService" Android:enabled="true"></service>

Update: Sie können auch einen relativen Klassennamen verwenden:

<service Android:name=".MyService" Android:enabled="true"></service>

Geben Sie den Klassennamen mit seinem vollständigen com.example.MyServiceClass anstelle von MyServiceClass an.

25
IanGSY

Eine weitere Sache ist, dass, wenn Sie die bindservice-Methode innerhalb der oncreate-Methode aufrufen, die onserviceconnected aufgerufen wird, nachdem die oncreate-Methode abgeschlossen ist. 

Daher zeigen alle Verweise auf die Schnittstellenfunktionen, bevor oncreate endet (oder bevor onserviceconnected aufgerufen wird) eine Nullzeiger-Ausnahme.

8
Abhijeet

Ein weiterer Grund für die ursprüngliche Frage könnte sein, dass der Dienst nicht bereits ausgeführt wird und Sie 0 als Flag an bindService übergeben. So wie:

bindService(intent, serviceConnection, 0);

Wenn Sie suchen, wäre:

bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
4
pakerfeldt

Es kann eine andere Erklärung geben, keine sehr häufige Situation, aber ich habe es geschafft, 2 Stunden zu verlieren, um es zu lösen.

Was ich also tat, war, dass ich das Bündel aus der mit der onBind-Methode erhaltenen Absicht wieder verwenden wollte. Aber ich habe mich für die faule Version entschieden und die Klasse der Absicht geändert. Anscheinend wird onServiceConnected dadurch nicht aufgerufen. Wahrscheinlich, weil das System einen Verweis auf die Absicht behält und beim Aufruf von onServiceConnected verwendet.

Ändern Sie abschließend nicht die Absicht, die Sie in onBind erhalten.

1

Sie müssen warten, um die onCreate () -Methode abzuschließen. .___. Beispiel: Stellen Sie Ihren Einkaufsservice unten ein:

Button button_useservice=findViewById(R.id.button_useservice);
            button_useservice.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    UsinService();
                }
            });

Ich rief mit einem leeren Intent - getContext().bindService(new Intent(), mConnection, Context.BIND_AUTO_CREATE) - bind an. Ich muss die Absicht präzisieren, um anzugeben, an welchen Dienst ich mich binden möchte. Dies ist offensichtlich ein Codefehler, aber die Logcat-Ausgabe war leider nicht klar genug.

0
Gallal

Wenn jemand immer noch nach der Antwort sucht, nachdem er alle anderen ausprobiert hat, kann dies helfen. onServiceConnected() wird nicht aufgerufen sofort nach bindService(...). es dauert ein paar sekunden. Wenn Sie also einen Wert von onServiceConnected() erhalten und ihn an anderer Stelle in onCreate oder onStart verwenden müssen, wird aufgrund des Werts eine NullPointerException ausgelöst verzögern. Wenn Sie also die Codezeile, die den Wert von onCreate oder onStart in onServiceConnected(){......} unter die Deklarationszeile des benötigten Werts benötigt, verschieben können, funktioniert sie möglicherweise.

0
Rohan buddy