stopSelf (int startId) не останавливает запущенную службу, если служба перезапускается после сбоя - PullRequest
0 голосов
/ 04 декабря 2018

Я обрабатываю одну песню за раз в запущенном сервисе.Я реализовал обработчик, фоновый поток и петлитель в этом потоке, который обрабатывает одно сообщение (загрузку песни) за раз.

Я обрабатываю загрузки один за другим в запущенном сервисе и вызываю stopSelf (int startId) после каждой загрузки по порядку.

Если служба запущена и не дает сбоя, то после завершения всех загрузок onDestroy моей службы загрузки называется Автоматически.

Но предположим, что если одна песня загружена, а затемПосле сбоя службы происходит сбой и система перезапускается, после чего вызывается stopSelf (int startId) после каждой оставшейся загрузки, но когда загружается последняя песня и вызывается stopSelf (int startId) для этой последней песни, onDestroy ofмоя служба загрузки не вызывается автоматически.

Я также попробовал более новую версию stopSelf (int startId), которая называется stop stopSelfResult (int startId), и возвращает true, если служба будет остановлена.Этот метод возвращает true для startId последней песни, если служба не аварийна.

Но если служба аварийно завершает работу и перезапускается, этот метод вызывается, но возвращает false для последнего song'startId, даже если startId дляпоследняя песня - метод onStartComamnd, после перезапуска службы она передается в этот метод.

Короче говоря, если служба, если не произошел сбой, то вызов stopSelf (int startId) автоматически вызывает onDestory службы.Но если служба выходит из строя и перезапускается системой, вызов stopSelf (int startId) не вызывает onDestroy службы автоматически.

Это MyDownloadServiceClass

public class MyDownloadService extends Service {
private static final String TAG = "MyTag";
private DownloadThread mDownlaodThread;

//this is started service

public MyDownloadService() {
}


@Override
public void onCreate() {
    super.onCreate();
    Log.d(TAG, "onCreate: called");

    mDownlaodThread = new DownloadThread();
    mDownlaodThread.start();

    while (mDownlaodThread.mHandler == null) {

    }
    mDownlaodThread.mHandler.setService(this);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    Log.d(TAG, "onStartCommand: called with Song Name: " +
            intent.getStringExtra(MainActivity.MESSAGE_KEY) + " Intent     Id: " + startId);
    final String songName =     intent.getStringExtra(MainActivity.MESSAGE_KEY);

    Message message = Message.obtain();
    message.obj = songName;
    message.arg1 = startId;

    mDownlaodThread.mHandler.sendMessage(message);

    return Service.START_REDELIVER_INTENT;
}

@Override
public IBinder onBind(Intent intent) {
    Log.d(TAG, "onBind: called");
    return null;
}

private void downloadSong(final String songName) {
    Log.d(TAG, "run: staring download");
    try {
        Thread.sleep(4000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    Log.d(TAG, "downloadSong: " + songName + " Downloaded...");
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.d(TAG, "onDestroy: called");
}
}

И этотакое обработчик загрузки.

private static final String TAG = "MyTag";
private MyDownloadService mService;

public DownloadHandler() {
}

@Override
public void handleMessage(Message msg) {

    downloadSong(msg.obj.toString());
    mService.stopSelf(msg.arg1);
    Log.d(TAG, "handleMessage: Song Downloaded: "+msg.obj.toString() + " Intent Id: "+msg.arg1);
}

private void downloadSong(final String songName){
    Log.d(TAG, "run: staring download");
    try {
        Thread.sleep(4000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    Log.d(TAG, "downloadSong: "+songName+" Downloaded...");
}

public void setService(MyDownloadService downloadService) {
    this.mService=downloadService;
}

В чем проблема и как ее решить?Спасибо.

...