Как правильно перезапустить службу Android в виде исключения?

Я пытаюсь разработать службу Android, которая может автоматически перезапускаться при исключениях.

  1. Я попытался добавить return START_STICKY; в метод onStartCommand. Но поскольку исключение не приведет к сбою службы, она не перезапустится автоматически.
  2. Я также пробовал методы, упомянутые в Как перезапустите службу в Android, чтобы снова вызвать службу oncreate, например, собрать следующий код, но после вызова onDestory()выполняется только onCreate(), но не onStartCommand()
    stopService(new Intent(this, YourService.class));
    startService(new Intent(this, YourService.class));
    

На данный момент сервис выглядит так:

public class PostService extends Service {

    site.bdsc.raspberry_gps_test.sim800Cutil.Sim800Manager Sim800Manager;
    private Thread thTestPost;
    private boolean mRunning;
    private static String TAG = "PostService";

    public PostService() {
    }

    @Override
    public void onCreate(){
        //get service
        thTestPost = new Thread(testPost,"testPost");
        Log.d(TAG,"Service on create");
    }

    @Override
    public int onStartCommand(Intent intent,int flags,int startId){
        if (!mRunning) {
            // Prevent duplicate service
            mRunning = true;
            Log.d(TAG,"Starting Post Service");
            try {
                Sim800Manager = Sim800ManagerImpl.getService("UART0");
            } catch (IOException e) {
                restartService(); //want to restart service here
            }
            thTestPost.start();
        }else{
            Log.d(TAG,"Duplicated Start Request!");
        }
        return START_STICKY;
    }
    @Override
    public void onDestroy(){
        super.onDestroy();
        Log.d(TAG,"Service on destory");
        mRunning = false;
        thTestPost.interrupt();
    }
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    private Runnable testPost = new Runnable() {
        @Override
        public void run() {
         // some code
        }
    };

    private void restartService(){
        stopService(new Intent(this, PostService.class));
        startService(new Intent(this,PostService.class));
    }
}

Как показано в коде, я хочу, чтобы PostService правильно перезапускался, когда IOException перехватывается.


person Sam Yu    schedule 24.04.2019    source источник
comment
это.stopSelf(); на IoException после этого запуска службы снова   -  person Ganesh Pokale    schedule 24.04.2019
comment
@GaneshPokale проблема в том, что он не перезапускается после stopSelf()   -  person Sam Yu    schedule 25.04.2019
comment
Попробуйте вызвать this.stopSelf() в блоке catch и startService(new Intent(this,PostService.class)) в onDestroy() после super.onDestroy().   -  person Onik    schedule 25.04.2019
comment
@Оник Ты понял! Спасибо.   -  person Sam Yu    schedule 26.04.2019


Ответы (1)


Используйте этот START_REDELIVER_INTENT

public static final int START_REDELIVER_INTENT

Константа для возврата из onStartCommand(Intent, int, int):, если процесс этой службы будет убит во время его запуска (после возврата из onStartCommand(Intent, int, int)) он будет запланирован для перезапуска, и последний доставленный Intent будет повторно доставлен ему снова через onStartCommand(Intent, int, int).

person Gowthaman M    schedule 24.04.2019
comment
Не работает. Служба не перезапускается после onDestory() - person Sam Yu; 25.04.2019
comment
@SamYu попробуйте вызвать метод restartService() внутри вашего onDestory() - person Gowthaman M; 25.04.2019