1

Ich arbeite an einer Android-App, die an einen Android-Dienst bindet.Android-Dienst bei App-Absturz lösen oder beenden

Das Problem ist, dass dieser Android-Dienst für eine Bluetooth-Verbindung mit einem anderen Gerät verantwortlich ist.

Momentan stellt mein Dienst eine DisconnectBluetooth() Methode zur Verfügung, die die Bluetooth Verbindung beendet.

Was ich tue, ist zu nennen, dass DisconnectBluetooth Methode unbindService durch einen Aufruf gefolgt, in meiner onDestroy Methode, so dass, wenn die App stoppt, wird die Bluetooth-Verbindung geschlossen werden, und der Dienst wird ungebundenes sein.

Die Sache ist die, dass, wenn meine app Abstürze, oder manchmal, wenn ich es zu Ausfahrt zwingen indem sie sie in den App Selector swipping, die onDestroy Methode nicht aufgerufen werden. Die App wird dann beendet, aber der Dienst ist noch am Leben, und so ist die Bluetooth-Verbindung auch noch am Leben.

Was kann ich tun, um sicher zu sein, die Bluetooth-Verbindung zu schließen, und wenn möglich, die Verbindung zu lösen?

@Override 
protected void onDestroy() { 
     if (_api.isConnect()) { //<-- If bound to service, and everything OK 
     _api.DisonnectBluetooth(); //<-- Close BT connection with device 
     _api.ReleaseService(); //<-- Unbinds service 
     } 
    } 
    super.onDestroy(); 
} 
+0

** onDestroy() ** ist nicht gleichbedeutend mit ** unbindService() **. Klingt so, als ob Sie einen gestarteten Service und einen gebundenen Service wünschen. Lesen Sie hierzu: developer.android.com/guide/components/bound-services.html - Wenn Sie zulassen, dass Ihr Dienst gestartet und gebunden wird, zerstört das System den Dienst nicht, wenn der Dienst gestartet wurde, wenn alle Clients gestartet wurden lösen. Stattdessen müssen Sie den Dienst explizit stoppen, indem Sie stopSelf() oder stopService() aufrufen. ' –

Antwort

1

Ich dachte immer zwingende onUnbind() Methode würde nur aufgerufen werden, wenn Aktivität ausdrücklich unbindService() Methode aufruft.

Aber nein, selbst wenn meine App abstürzt oder den Exit durch das Ausweichen der letzten App-Auswahl erzwingt, wird sie aufgerufen. Ich beschloss, so zu verwenden onunbind statt onTaskRemoved

HINWEIS: Ich verwende Xamarin, und ich kann nicht garantieren, dass dieses auf Java Android arbeiten

+0

Entschuldigung für meinen früheren Kommentar. Der Text dieser Antwort liest sich nicht wie eine Antwort, aber er beantwortet tatsächlich die Frage. –