Ist der Android-Dienst auch nach dem Aufruf von onDestroy () noch am Leben?

9

Zum Studieren des Android-Dienstes habe ich ein Testprogramm geschrieben, das auf dem Bildschirm drei Schaltflächen "Dienst binden", "Dienst losbinden" und "Echo senden" enthält. Wenn sie geklickt werden, verwenden sie bindService() , unbindService() und a Messenger , um mit dem Dienst zu kommunizieren.

Hier sind die Service-Codes:

%Vor%

Und hier ist der Aktivitätscode:

%Vor%

Wenn ich auf "bind service" und "send echo" klicke. Ich kann sehen, dass der Dienst verbunden ist und die Nachrichtenkommunikation ist gut. Und dann klicken Sie auf "Dienst aufheben", sah ich den Service onDestroy() aufgerufen werden, so erwarte ich, dass der Dienst gestoppt wird und sollte nicht auf die kommende Nachricht erneut antworten. Aber tatsächlich scheint der Dienst noch am Leben zu sein und ich könnte die Echo-Nachricht wieder erhalten, wenn ich auf den "Sende Echo" -Button klicke. Ich frage mich, ob ich irgendetwas falsch gemacht habe? Oder verstehe ich den Service nicht ganz?

Hoffe jemand kann helfen, danke.

    
popo 29.06.2013, 09:41
quelle

5 Antworten

4

Ein Service ist "gebunden", wenn eine Anwendungskomponente durch Aufruf von bindService() an sie bindet. Ein gebundener Dienst bietet eine Client-Server-Schnittstelle, die es Komponenten ermöglicht, mit dem Dienst zu interagieren, Anforderungen zu senden, Ergebnisse zu erzielen und dies sogar über Prozesse mit Interprozesskommunikation (IPC) hinweg zu tun. Ein gebundener Service wird nur so lange ausgeführt, wie eine andere Anwendungskomponente daran gebunden ist .

Ссылка

Ein Dienst wird heruntergefahren, nachdem alle bindService() -Aufrufe ihre entsprechenden unbindService() -Aufrufe hatten. Wenn keine gebundenen Clients vorhanden sind, benötigt der Dienst auch stopService () genau dann, wenn jemand startService () für den Dienst aufgerufen hat.

Zeichnung aus dem folgenden Link.

Wie kann ich prüfen, ob ein Dienst unter Android läuft? .

%Vor%

Beispiel:

Ich habe das unten getestet, es funktioniert gut.

%Vor%

MainAactivity.java

%Vor%     
Raghunandan 29.06.2013, 10:45
quelle
0

Dieser Link ( Do I müssen Sie sowohl unbindService als auch stopService für Android-Dienste aufrufen? ), dass Sie stopService vor dem unbindService aufrufen müssen.

Probieren Sie das aus.

    
Wand Maker 29.06.2013 09:47
quelle
0

Von Zypern :

  

Diese zwei Pfade sind nicht vollständig getrennt. Das heißt, Sie können an einen Dienst binden, der bereits mit startService () gestartet wurde. Beispielsweise könnte ein Hintergrundmusikdienst durch Aufrufen von startService () mit einer Absicht gestartet werden, die die abzuspielende Musik identifiziert. Später, möglicherweise wenn der Benutzer eine gewisse Kontrolle über den Player ausüben oder Informationen über den aktuellen Song erhalten möchte, kann eine Aktivität durch Aufrufen von bindService () an den Service gebunden werden. In solchen Fällen stoppt stopService () oder stopSelf () den Dienst nicht, bis alle Clients die Verbindung getrennt haben.

Sie müssen also unBindService () und nach stopService ()

aufrufen     
baptisterobert 29.06.2013 10:27
quelle
0

Ich finde die Terminologie / Nomenklatur persönlich unbefriedigend / irreführend. "onDestroy" und "stopService" könnten besser verstanden werden, wenn sie "FlagForAndroidOSDestruction" und "FlagForAndroidStopService" heißen.

Wenn man eines der folgenden Beispiele herunterlädt / kompiliert / ausführt, kann man sehen, dass selbst wenn die OnHandleIntent beendet ist oder stopService aufgerufen wurde, der Prozess und sogar der Dienst noch herumhängen können! Um dies zu sehen, starte einfach das / die Beispiel (e) unten und dann auf deinem Smartphone / Tablet Einstellungen- & gt; Apps- & gt; Ausführen- & gt; Zeige laufende Dienste und Einstellungen- & gt; Apps- & gt; Ausführen- & gt; Gespeicherte Prozesse anzeigen

Wenn Sie diese sehen, versuchen Sie, eine Menge anderer Apps auf dem Telefon zu starten, und DANN wird Android diese Dienste & amp; Prozess.

Ссылка

Ссылка

Wie überprüft man alle laufenden Dienste in Android?

    
JDOaktown 08.01.2015 18:39
quelle
0

Ja, das ist eine Schlussfolgerung aus den offiziellen Dokumenten :

  

Ein Dienst kann sowohl gestartet werden als auch Verbindungen zu ihm haben. In diesem Fall wird das System den Dienst so lange ausführen, wie es gestartet wurde, oder es gibt eine oder mehrere Verbindungen mit dem Context.BIND_AUTO_CREATE-Flag. Wenn keine dieser Situationen zutrifft, wird die Methode onDestroy () des Service aufgerufen und der Service wird effektiv beendet . Alle Bereinigungen (Anhalten von Threads, Aufheben der Registrierung von Empfängern) sollten nach der Rückkehr von onDestroy () abgeschlossen sein.

    
Marian Paździoch 26.02.2015 15:24
quelle

Tags und Links