Gibt es eine Möglichkeit zu verhindern, dass mein Dienst automatisch von ActivityManager neu gestartet wird, nachdem er "abgestürzt" ist? In einigen Szenarien beende ich meinen Dienst zwangsweise beim Beenden des Programms, möchte aber nicht, dass Android ihn immer wieder neu startet.
Antworten
Zu viele Anzeigen?Dieses Verhalten ist definiert durch den Rückgabewert von onStartCommand()
in Ihrem Service
Umsetzung. Die Konstante START_NOT_STICKY
weist Android an, den Dienst nicht neu zu starten, wenn er läuft, während der Prozess "beendet" wird. Mit anderen Worten:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// We don't want this service to continue running if it is explicitly
// stopped, so return not sticky.
return START_NOT_STICKY;
}
HTH
Hier ist die Lösung, die ich mir ausgedacht habe, falls sie jemand anderem helfen könnte. Meine App startete immer noch neu, sogar mit START_NOT_STICKY
. Daher prüfe ich stattdessen, ob die Absicht null
was bedeutet, dass der Dienst vom System neu gestartet wurde.
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
// Ideally, this method would simply return START_NOT_STICKY and the service wouldn't be
// restarted automatically. Unfortunately, this seems to not be the case as the log is filled
// with messages from BluetoothCommunicator and MainService after a crash when this method
// returns START_NOT_STICKY. The following does seem to work.
Log.v(LOG_TAG, "onStartCommand()");
if (intent == null) {
Log.w(LOG_TAG, "Service was stopped and automatically restarted by the system. Stopping self now.");
stopSelf();
}
return START_STICKY;
}
Ihr Dienst kann einen Wert in den SharedPreferences speichern. Zum Beispiel können Sie jedes Mal, wenn Ihr Dienst startet, einen Wert wie diesen speichern: store("serviceStarted", 1);
Wenn Ihr Dienst regulär beendet wird (Sie senden eine entsprechende Nachricht), setzen Sie diesen Wert außer Kraft: store("serviceStarted", 0);
Wenn Ihr Dienst sich das nächste Mal selbst neu startet, stellt er fest, dass der Wert serviceStarted "1" ist - das bedeutet, dass Ihr Dienst nicht regulär angehalten wurde und sich selbst neu gestartet hat. Wenn Sie dies feststellen, kann Ihr Dienst: stopSelf(); aufrufen, um sich selbst zu beenden.
Für weitere Informationen: http://developer.Android.com/reference/Android/app/Service.html#ServiceLifecycle
1 Stimmen
Zeigen Sie Ihre Skelettimplementierung des Dienstes.
0 Stimmen
Ist es ein normaler Dienst oder ein IntentService?