如果崩溃后重新启动服务,stopSelf(int startId)不会停止启动的服务

时间:2018-12-04 12:55:22

标签: android service android-service

我正在启动服务中一次处理一首歌曲的下载。我已经在该线程上实现了处理程序以及后台线程和循环程序,该线程可以一次处理一条消息(歌曲下载)。

我正在处理已启动服务中的下载,并在每次下载按顺序完成后调用stopSelf(int startId)。

如果该服务已启动并且没有崩溃,则在完成所有下载之后,我的下载服务的onDestroy会自动称为。

但是,假设如果下载了一首歌曲,然后服务崩溃并在一段时间后被系统重新启动,则在每次剩余的下载之后调用stopSelf(int startId),但是当最后一首歌曲下载完毕并且stopSelf(int最后一首歌(我的onDestroy)被调用 下载服务不会自动调用。

我还尝试了stopSelf(int startId)的较新版本,即stop stopSelfResult(int startId),如果服务将停止,则返回true。如果服务没有崩溃,则此方法对最后一首歌的startId返回true。

但是,如果服务崩溃并重新启动,则将调用此方法,但为最后一首歌的startId返回false,即使重新启动服务后最后一首歌的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;
}

问题是什么,解决方案是什么? 谢谢。

0 个答案:

没有答案