Sauber verbindlich/unverbindlich zu einem Dienst in einer Anwendung
Ich habe ein Android-Anwendung, die Bindung, die zu einem anhaltenden service (gestartet mit startService()
).
Der service ist ein integraler Bestandteil der Anwendung und somit in fast jeder Aktivität. Deshalb will ich binden um den service nur einmal (statt verbindlich/unverbindlich, in jeder Aktivität) und halten die Bindung während der Laufzeit meiner Anwendung.
Habe ich erweitert, von Anwendung binden und den service in Anwendung#onCreate(). Allerdings habe ich jetzt das problem, dass ich nicht weiß, Wann meine Anmeldung besteht seit Anwendung#onTerminate() wird nie aufgerufen, siehe JavaDoc:
Diese Methode ist für den Einsatz in emulierten Prozess-Umgebungen. Es wird nie
genannt werden auf einer Produktions-Android-Gerät, wo Prozesse entfernt
indem Sie einfach Sie zu töten; keine Benutzer-code (einschließlich dieser callback) ist
ausgeführt, wenn dies zu tun.
So, wie ich das sauber lösen, die von einem Dienst verpflichtet, in Anwendung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Löste ich dieses problem durch das zählen der Referenzen auf die service-Bindung in der
Application
. JederActivity
rufenacquireBinding()
in IhreronCreate()
Methoden und callreleaseBinding()
imonDestroy()
. Wenn der Referenzzähler null erreicht, ist die Bindung freigegeben.Hier ein Beispiel:
context.startService()
und gekennzeichnet ist klebrig, damit es läuft, bis es manuell gestoppt oder beendet sich selbst.startService()
aber auch gebunden ist.Aus Sven ' s Antwort:
Ich bin damit einverstanden, ABER Sie sollten es nicht tun in der onDestroy - das wird Häufig nicht genannt.
Stattdessen schlage ich vor, die folgenden (basierend auf deinem code-Beispiel)...
ABER, meine Verwendung von isFinishing() ist nur so ein Gedanke - ich bin nicht sicher, dass es zuverlässig ist. Vielleicht onPause/onStop aufgerufen, mit isFinishing() false, dann aber die Aktivität wird getötet - und Ihre releaseBinding() nie aufgerufen wird.
Wenn Sie loszuwerden, die isFinishing überprüfen, ich denke, Sie brauchen, um die acquireBinding () - Aufruf aus onCreate zu onStart/onResume (je nach sdk-version), um sicherzustellen, dass Ihre ref zählen nicht Durcheinander kommen.
Wer wusste, dass die Freigabe der app-Dienst wäre so kompliziert!
Ist unverbindlich überhaupt notwendig in diesem Fall? Die Anwendung getötet wird trotzdem. Ich habe versucht, die Implementierung einer Beispielanwendung dies tun, ohne unverbindlich und es scheint, richtig zu arbeiten.