我正在启动服务中一次处理一首歌曲的下载。我已经在该线程上实现了处理程序以及后台线程和循环程序,该线程可以一次处理一条消息(歌曲下载)。
我正在处理已启动服务中的下载,并在每次下载按顺序完成后调用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;
}
问题是什么,解决方案是什么? 谢谢。