zer0stimulus
zer0stimulus

Reputation: 23606

Android: How to prevent service from restarting after crashing?

Is there a way to prevent my Service from automatically being restarted by ActivityManager after it "crashes"? In some scenarios, I forcefully kill my service on program exit, but do not want Android to keep restarting it.

Upvotes: 10

Views: 8099

Answers (3)

Jon
Jon

Reputation: 9803

Here's the solution I came up with in case it could help someone else. My app still restarted even with START_NOT_STICKY. So instead i check to see if the intent is null which means the service was restarted by the system.

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

Upvotes: 6

devunwired
devunwired

Reputation: 63293

This behavior is defined by the return value of onStartCommand() in your Service implementation. The constant START_NOT_STICKY tells Android not to restart the service if it s running while the process is "killed". In other words:

@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

Upvotes: 32

Basic Coder
Basic Coder

Reputation: 11422

Your service can store a value in the SharedPreferences. For example you can store something like this everytime your service starts: store("serviceStarted", 1);

When your service terminates regulary (you send a message to do so) you override this value: store("serviceStarted", 0);

When the next time your service restarts itself it detects that the serviceStarted value is "1" - that means that your service wasnt stopped regulary and it restarted itself. When you detect this your service can call: stopSelf(); to cancel itself.

For more information: http://developer.android.com/reference/android/app/Service.html#ServiceLifecycle

Upvotes: 1

Related Questions