Android: stopService () ruft onDestroy () nicht auf!

8

Ich habe große Probleme mit dem Stoppen eines Dienstes, der Audiodatei abspielt. Ich möchte den aktuellen Dienst anhalten, bevor ich eine andere Datei wiedergebe.

Aktivität:

%Vor%

Service:

%Vor%

Aber leider funktioniert es nicht - eigentlich kommt es gar nicht auf den "Service getötet" in OnDestroy () an.

Was mache ich falsch?

    
Primož Kralj 31.01.2012, 20:22
quelle

3 Antworten

15

Zuerst ist es onDestroy, nicht OnDestroy. Zweitens müssen Sie die Annotation @Override für die Überprüfung der Kompilierungszeit verwenden, sodass Ihr Dienstcode ungefähr so ​​aussehen sollte:

%Vor%     
Mayjak 31.01.2012, 20:25
quelle
5

Ich hatte ein ähnliches Problem, selbst wenn onDestroy korrekt eingerichtet war - die Antwort könnte für Leute nützlich sein, die auf diese Seite kommen. Für mich wurde onDestroy nicht sofort während des stopService aufgerufen, manchmal für eine sehr lange Zeit - damit der Dienst funktioniert, wenn er hätte aufhören sollen.

Die Antwort ist, dass dies erwartetes Verhalten ist - ich kann es erraten, weiß aber nicht genau warum. Also war meine Lösung in diesem Fall, eine öffentliche statische Methode zu erstellen, um die Aktionen des Dienstes manuell zu stoppen, was zum Zeitpunkt des Aufrufs geschieht, dann wird stopService () onDestroy in seiner eigenen guten Zeit aufrufen ...

Im Falle dieses Beispiels (das wahrscheinlich schon lange weg ist, würde ich wahrscheinlich entscheiden, den Dienst so lange laufen zu lassen, bis es die App erwartet, aber Möglichkeiten zum Ändern der Audiodatei bietet, während der Dienst noch aktiv ist.

    
james_alvarez 20.02.2015 16:53
quelle
2

Zuerst müssen Sie klären, wie viele Arten von Diensten in Android. AFAIK gibt es:

  • Vordergrunddienst.
  • Hintergrunddienst.
  • Gebundener Service.
  • Absichtsdienst.

Diese Dienste enden auf unterschiedliche Weise.

  • Im Vordergrund: Halten Sie nur an, wenn Sie es absichtlich stoppen, indem Sie stopService() in Aktivität oder Fragment, wo Sie diesen Dienst starten, aufrufen oder stopItself() in seinem eigenen Dienst aufrufen. Und bitte beachten Sie, dass nur diese Methode den Service onDestroy() . Auslöst.
  • Hintergrund: stopService() und stopItself() funktionieren genauso wie Vordergrund. Darüber hinaus sollten Sie wissen, dass sich dieser Dienst im selben Thread befindet, in dem die Aktivität oder das Fragment ihn aufruft. Wenn Sie also eine Aktivität oder ein Fragment zerstören, wird dieser Dienst ebenfalls beendet, ohne jedoch onDestroy() aufzurufen. Es zerstört im Grunde den Untergrund. Wenn Sie also bei diesem Service stoppen möchten, müssen Sie android:stopWithTask="false" hinzufügen, wenn Sie den Service in der Manifest-Datei wie folgt deklarieren:

    %Vor%

    Und jetzt in Ihrer Serviceklasse können Sie diese Methode überschreiben, die ausgelöst wird, wenn dieser Dienst beendet wird:

    %Vor%
  • Gebunden: Sie müssen sich selbst mit bindService() und unbindService() behandeln, Sie werden feststellen, dass es absolut dasselbe ist wie starService() und stopService()

  • Absicht: Diese Art von Service stoppt selbst, wenn sie ihre Jobs beendet hat. Und Sie können ResultReceiver verwenden, um zwischen Dienst und Aktivität oder Fragment zu kommunizieren. Es ist ähnlich wie BroadcastReceiver . Sie können beispielsweise einfach auf Google suchen.

Fassen Sie zusammen: basierend auf Ihrem Zweck, wählen Sie die Art von Service erfüllt Sie. Und alle stimmen dem zu:

  • Zählen Sie nicht auf onDestroy (), um zu wissen, wann der Dienst stoppt, weil es wird manchmal unterirdisch genannt; genauer, OnDestroy Anrufe Wenn stopService () oder stopItSelf () aufruft (BoundService funktioniert in der Ich denke, aber auf ähnliche Weise, vielleicht unbind (), tat ich nicht Test noch).
  • Verwenden Sie das Attribut android: stopWithTask="false", um zu wissen, wann Service stoppt wirklich.
  • Alle Arten von Diensten werden angehalten, wenn das Gerät herunterfährt oder das Betriebssystem es beendet Gerät leckt das Gedächtnis.
  • Sie sollten sich auch die Flag-Rückgabe von onStartCommand() ansehen in der Lage sein, mit zu tun, wenn Dienste wie Neustart Service oder wieder aufhören etwas. Hier sind einige Suchbegriffe, die Sie suchen können:
    • START_STICKY
    • <action android:name="android.intent.action.BOOT_COMPLETED" />
    • <action android:name="android.intent.action.ACTION_SHUTDOWN" />
    • <actionandroid:name="android.intent.action.QUICKBOOT_POWEROFF" />
Nguyen Tan Dat 21.09.2017 04:35
quelle

Tags und Links