2012-02-13 2 views
6

Есть ли способ предотвратить автоматическое перезапуск моей службы ActivityManager после ее «сбоев»? В некоторых сценариях я насильно убиваю свою службу при выходе из программы, но не хочу, чтобы Android продолжал ее перезапускать.Android: Как предотвратить перезапуск службы после сбоя?

+1

Показать скелетную реализацию услуги. –

+0

Является ли это регулярной услугой или IntentService? –

ответ

1

Ваш сервис может хранить значение в SharedPreferences. Например, вы можете хранить что-то подобное при каждом запуске вашего сервиса: магазин («serviceStarted», 1);

Когда ваше обслуживание прерывается (вы отправляете сообщение для этого), вы переопределяете это значение: магазин («serviceStarted», 0);

Когда при следующем запуске службы он обнаруживает, что значение serviceStarted равно «1», это означает, что ваша служба не была остановлена ​​и она перезапустилась сама. Когда вы обнаружите это, ваша служба может позвонить: stopSelf(); отменить себя.

Для получения дополнительной информации: http://developer.android.com/reference/android/app/Service.html#ServiceLifecycle

30

Такое поведение определяется возвращаемым значением onStartCommand() в вашем Service реализации. Константа START_NOT_STICKY сообщает Android не перезапускать службу, если она работает, пока процесс «убит». Другими словами:

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

НТН

+3

Хотя это не отмечено как принятое решение, это правильный ответ – scooterman

+0

Это не будет работать, если есть выдающиеся намерения. У меня есть эта проблема, и вышеупомянутый подход не работает. Возможно, подход ниже - лучшая альтернатива, но я еще не реализовал ее. Попробовали другие подходы, предложенные в переполнении стека, но они еще не преуспели. –

+0

@BrianReinhold Ваша проблема звучит так, как будто у нее есть определенный поворот в этом вопросе, разместили ли вы свое объяснение в своем случае использования и проблемах, которые вы наблюдали? Мне было бы интересно изучить его больше. – Devunwired

5

Вот решение, которое я придумал в случае, если это может помочь кому-то еще. Мое приложение все еще перезапускалось даже с START_NOT_STICKY. Поэтому вместо этого я проверяю, есть ли цель null, что означает, что служба была перезапущена системой.

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

Спасибо !. У меня было требование получить частые обновления местоположения и отправить его на сервер с сервиса. основанный на уведомлении служба переднего плана, но он прекратил получать обновления местоположения, когда приложение закрыто. После двухдневной борьбы я добрался до вашего ответа и изменил ваш код. Перед 'stopSelf()', я настроил перезапуск одной службы с помощью 'AlarmManager' после задержка на 10 секунд.И это сработало очень хорошо, теперь получая обновления местоположения от службы непрерывно. Большое спасибо! – manoj

Смежные вопросы