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?
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.
Zuerst müssen Sie klären, wie viele Arten von Diensten in Android. AFAIK gibt es:
Diese Dienste enden auf unterschiedliche Weise.
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:
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()
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:
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" />