Was ist der Unterschied zwischen START_STICKY
und START_NOT_STICKY
während der Implementierung von Diensten in Android? Könnte jemand auf einige Standardbeispiele hinweisen ..?
Was ist der Unterschied zwischen START_STICKY
und START_NOT_STICKY
während der Implementierung von Diensten in Android? Könnte jemand auf einige Standardbeispiele hinweisen ..?
Antworten:
Beide Codes sind nur relevant, wenn dem Telefon der Speicher ausgeht und der Dienst beendet wird, bevor die Ausführung abgeschlossen ist. START_STICKY
Weist das Betriebssystem an, den Dienst neu zu erstellen, nachdem er über genügend Speicher verfügt, und ihn onStartCommand()
erneut mit einer Null-Absicht aufzurufen . START_NOT_STICKY
Weist das Betriebssystem an, den Dienst nicht erneut zu erstellen. Es gibt auch einen dritten Code START_REDELIVER_INTENT
, der das Betriebssystem anweist, den Dienst neu zu erstellen und die gleiche Absicht erneut zu liefern onStartCommand()
.
Dieser Artikel von Dianne Hackborn erklärte den Hintergrund viel besser als die offizielle Dokumentation.
Quelle: http://android-developers.blogspot.com.au/2010/02/service-api-changes-starting-with.html
Der Schlüsselteil hier ist ein neuer Ergebniscode, der von der Funktion zurückgegeben wird und dem System mitteilt, was es mit dem Dienst tun soll, wenn sein Prozess während der Ausführung beendet wird:
START_STICKY entspricht im Wesentlichen dem vorherigen Verhalten, bei dem der Dienst "gestartet" bleibt und später vom System neu gestartet wird. Der einzige Unterschied zu früheren Versionen der Plattform besteht darin, dass onStartCommand () bei einem Neustart aufgrund eines gestoppten Prozesses bei der nächsten Instanz des Dienstes mit einer Null-Absicht aufgerufen wird, anstatt überhaupt nicht aufgerufen zu werden. Dienste, die diesen Modus verwenden, sollten immer nach diesem Fall suchen und angemessen damit umgehen.
START_NOT_STICKY gibt an, dass nach der Rückkehr von onStartCreated () der Dienst gestoppt und nicht neu gestartet wird, wenn der Prozess ohne verbleibende Startbefehle beendet wird. Dies ist viel sinnvoller für Dienste, die nur ausgeführt werden sollen, während an sie gesendete Befehle ausgeführt werden. Beispielsweise kann ein Dienst alle 15 Minuten von einem Alarm aus gestartet werden, um einen Netzwerkstatus abzufragen. Wenn es während dieser Arbeit getötet wird, ist es am besten, es einfach anzuhalten und beim nächsten Alarm auszulösen.
START_REDELIVER_INTENT ist wie START_NOT_STICKY, außer wenn der Prozess des Dienstes abgebrochen wird, bevor stopSelf () für eine bestimmte Absicht aufgerufen wird, wird diese Absicht erneut an ihn gesendet, bis er abgeschlossen ist (es sei denn, nach einigen weiteren Versuchen kann er immer noch nicht abgeschlossen werden). an welchem Punkt das System aufgibt). Dies ist nützlich für Dienste, die Arbeitsbefehle erhalten und sicherstellen möchten, dass sie die Arbeit für jeden gesendeten Befehl schließlich abschließen.
START_NOT_STICKY
?
START_REDELIVER_INTENT
ist START_NOT_STICKY
. Stattdessen ist es wieSTART_STICKY
Unterschied:
Das System versucht, Ihren Dienst neu zu erstellen, nachdem er beendet wurde
Das System versucht nicht , Ihren Dienst neu zu erstellen, nachdem er beendet wurde
Standardbeispiel:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
START_REDELIVER_INTENT
. Ich habe gerade START_STICKY
die App mit den neuesten Apps getestet und beendet. Dann ruft es den Service zurück. Aber START_REDELIVER_INTENT
nie wieder angerufen. Warum?
Die Dokumentation für START_STICKY
und START_NOT_STICKY
ist recht unkompliziert.
Wenn der Prozess dieses Dienstes beim Starten abgebrochen wird (nachdem Sie von zurückgekehrt sind
onStartCommand(Intent, int, int))
, lassen Sie ihn im gestarteten Zustand, behalten Sie diese übermittelte Absicht jedoch nicht bei. Später versucht das System, den Dienst neu zu erstellen, da er sich im gestarteten Zustand befindet Es wird garantiert, dassonStartCommand(Intent, int, int)
nach dem Erstellen der neuen Dienstinstanz ein Aufruf ausgeführt wird . Wenn keine ausstehenden Startbefehle an den Dienst übermittelt werden sollen, wird der Aufruf mit einem Null-Intent-Objekt ausgeführt. Sie müssen daher darauf achten, dies zu überprüfen.Dieser Modus ist sinnvoll für Dinge, die explizit gestartet und gestoppt werden, um für beliebige Zeiträume ausgeführt zu werden, z. B. ein Dienst, der die Wiedergabe von Hintergrundmusik durchführt.
Beispiel: Beispiel für einen lokalen Dienst
Wenn der Prozess dieses Dienstes beim
onStartCommand(Intent, int, int))
Starten abgebrochen wird (nachdem Sie von zurückgekehrt sind und keine neuen Startabsichten für die Übermittlung an diesen Dienst vorhanden sind, nehmen Sie den Dienst aus dem gestarteten Zustand und erstellen Sie ihn erst nach einem zukünftigen expliziten Aufruf vonContext.startService(Intent)
. Der Dienst erhält keinenonStartCommand(Intent, int, int)
Anruf mit einernull
Absicht, da er nicht neu gestartet wird, wenn keine ausstehenden Absichten zu liefern sind.Dieser Modus ist sinnvoll für Dinge, die aufgrund des Startvorgangs etwas arbeiten möchten, kann jedoch unter Speicherdruck gestoppt werden und startet sich später explizit erneut, um mehr Arbeit zu erledigen. Ein Beispiel für einen solchen Dienst wäre ein Dienst, der Daten von einem Server abfragt: Er könnte einen Alarm so planen, dass er jede
N
Minute abfragt, indem der Alarm seinen Dienst startet. WennonStartCommand(Intent, int, int)
es vom Alarm aufgerufen wird, plant es einen neuen Alarm für N Minuten später und erzeugt einen Thread, um seine Vernetzung durchzuführen. Wenn der Prozess während dieser Überprüfung abgebrochen wird, wird der Dienst erst neu gestartet, wenn der Alarm ausgelöst wird.
Beispiel: ServiceStartArguments.java