10 Stimmen

Android: Wie kann man verhindern, dass der Dienst nach einem Absturz neu gestartet wird?

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.

1 Stimmen

Zeigen Sie Ihre Skelettimplementierung des Dienstes.

0 Stimmen

Ist es ein normaler Dienst oder ein IntentService?

32voto

devunwired Punkte 61902

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

6voto

Jon Punkte 8035

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;
}

1voto

Basic Coder Punkte 10159

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X