"Wenn Sie einen Android-Dienst mit startService(..)
diesem Dienst starten , wird er weiterhin ausgeführt, bis Sie ihn explizit aufrufen stopService(..)
. Es gibt zwei Gründe, warum ein Dienst vom System ausgeführt werden kann. Wenn jemand anruft, ruft Context.startService()
das System den Dienst ab (erstellt ihn und ruft seine onCreate()
Methode auf, wenn erforderlich) und rufen Sie dann seine onStartCommand(Intent, int, int)
Methode mit den vom Client angegebenen Argumenten auf. Der Dienst wird zu diesem Zeitpunkt weiter ausgeführt, bis Context.stopService()
oder stopSelf()
aufgerufen wird. Beachten Sie, dass mehrere Aufrufe Context.startService()
nicht verschachtelt werden sollen (obwohl sie zu mehreren entsprechenden Aufrufen führen onStartCommand()
), also nein Unabhängig davon, wie oft ein Dienst gestartet wird, wird er einmal gestoppt Context.stopService()
oder stopSelf()
aufgerufen. Dienste können jedoch ihre Dienste verwendenstopSelf(int)
Methode, um sicherzustellen, dass der Dienst nicht gestoppt wird, bis die gestarteten Absichten verarbeitet wurden.
Clients können auch Context.bindService()
eine dauerhafte Verbindung zu einem Dienst herstellen. Dadurch wird der Dienst ebenfalls erstellt, wenn er noch nicht ausgeführt wird ( onCreate()
währenddessen anruft ), aber nicht anruft onStartCommand()
. Der Client erhält das IBinder
Objekt, das der Dienst von seiner onBind(Intent)
Methode zurückgibt , sodass der Client dann den Dienst zurückrufen kann. Der Dienst wird so lange ausgeführt, wie die Verbindung hergestellt wurde (unabhängig davon, ob der Client eine Referenz auf dem Dienst behält oder nicht IBinder
). Normalerweise IBinder
bezieht sich die Rückgabe auf eine komplexe Schnittstelle, die in AIDL geschrieben wurde.
Ein Dienst kann sowohl gestartet als auch mit Verbindungen verbunden werden. In einem solchen Fall hält das System den Dienst so lange am Laufen, wie er entweder gestartet wird oder eine oder mehrere Verbindungen mit dem Context.BIND_AUTO_CREATE
Flag bestehen. Sobald keine dieser Situationen zutrifft, wird die onDestroy()
Methode des Dienstes aufgerufen und der Dienst effektiv beendet. Alle Bereinigungen (Stoppen von Threads, Aufheben der Registrierung von Empfängern) sollten nach der Rückkehr von abgeschlossen sein onDestroy()
. "