So erzwingen Sie einen Neustart des Dienstes?
Ich habe einen hintergrund-Dienst, der manchmal auch getötet wird, indem das OS, wenn es zur Neige geht auf Speicher.
- Wie die Simulation dieses Verhaltens, so kann ich Debuggen?
Den dev-guide einfach sagt "wenn Ihr Dienst gestartet ist, dann müssen Sie es entwerfen, um ordnungsgemäß zu behandeln Neustart vom system. Wenn das system tötet Ihren Dienst, startet es, sobald die Ressourcen wieder verfügbar werden".
- Was ist die Reihenfolge der Aufrufe ab, wenn es getötet wird, wenn es fertig ist Neustarten?
Auf einer Seite (Verwandte) Frage, was passiert mit ein, die aktiv AsyncTask gestartet, in den Dienst, wenn der Dienst getötet wird, die von dem OS, also ohne service.onDestroy immer genannt? Hat es laufen zu halten oder get ripped schweigend zusammen mit dem service?
InformationsquelleAutor der Frage Eric Chen | 2011-08-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Unter neuere Versionen, a service werden die folgenden Ereignisse ausgelöst:
Gefolgt von...
Ich weiß, in die Kommentare oben, die Sie erwähnen, mit, dass, aber es lohnt sich zu wiederholen: nicht die alten "onStart ()" - Ereignis. onStartCommand ist die neue Art, Dinge zu tun.
onCreate() kann verwendet werden keine Objekte erstellen, etc. aber der eigentlich code von Ihrem Dienst in der onStartCommand().
Wenn Sie fertig mit der onStartCommand (), sollten Sie ein Ergebnis zurückgeben. Mit "START_STICKY" erzählt die OS kann es neu starten, wenn es benötigt, um es zu töten. Mit "START_NOT_STICKY" erzählt die os nicht die Mühe, um es neu zu starten nach dem Speicher wieder verfügbar wird. Das bedeutet, dass Ihre Anwendung brauchen würde, um manuell starten Sie den Dienst erneut. Es gibt auch andere Möglichkeiten - überprüfen Sie die API-docs.
Überprüfen diese Flaggen können Sie sehen, warum Sie Ihren Dienst begonnen hat - wenn Sie Ihre eigene app gestartet, oder wenn das OS gestartet, es neu zu starten. Sie müssen in regelmäßigen Abständen speichern den Zustand jeder wichtigen Variablen so, dass wenn das Betriebssystem gestartet ist es, das Sie abrufen können, die Sie könnte wahrscheinlich verwenden Sie ein SharedPreferences privaten Speicher zu speichern diese. Definitiv speichern in der onDestroy-Ereignis, aber zählen Sie nicht darauf, dass genannt.
Außerdem ist es empfohlen, dass Sie speichern die enthalten. Feld in eine variable, und verwenden Sie es mit einem stopSelfResult(enthalten.), wenn Ihr Dienst getan ist ausgeführt.
Im Hinterkopf behalten, dass, wenn Ihr service ist getötet durch das OS möglicherweise haben Sie nicht die Möglichkeit zum speichern von Variablen. Sie müssen in der Lage sein zu sehen, ob Ihr Staat, wo Sie erwarten, wenn Sie neu gestartet werden, indem das Betriebssystem und wenn nicht gerade alles neu einstellen oder würdevoll sterben vielleicht.
Soweit Debuggen, haben Sie als schreiben noch eine weitere app, die tut nichts, sondern saugen die Speicher in einer Aktivität, um Sie zu zwingen, eine low-memory-Bedingung? Die top-Aktivität sollte den Vorzug erhalten, um die Speicher-und Kraft dem Dienst zu sterben.
Zusätzliche threads gestartet, in der service sind immer noch Teil der gleichen Anwendung Prozess,so dass Sie getötet werden würde, zusammen mit dem service (und dem rest der Anwendung.) Überprüfen können Sie dies, indem Sie regelmäßige log-Anweisungen innerhalb des threads und dann die Tötung der service.
Etwas anderes könnte für Sie sinnvoll ist, überprüfen, um zu sehen, ob Ihr Dienst wird bereits ausgeführt, von innerhalb Ihrer Anwendung. Hier ist eine Funktion, das zu tun:
InformationsquelleAutor der Antwort Tony Maro
Wenn es einen lokalen Dienst (der Standard), im Gegensatz zu einem remote-Service, dann ist es die in demselben Prozess ausgeführt wie die app. Dies bedeutet, dass Sie emulieren kann töten nur durch töten Ihrer app verarbeiten. Sie können tun, dass mit ddms und zum Beispiel in eclipse oder von der Befehlszeile aus oder sogar von Ihrem Handy (Einstellungen -> Anwendungen).
InformationsquelleAutor der Antwort Erdal