Я обрабатываю одну песню за раз в запущенном сервисе.Я реализовал обработчик, фоновый поток и петлитель в этом потоке, который обрабатывает одно сообщение (загрузку песни) за раз.
Я обрабатываю загрузки один за другим в запущенном сервисе и вызываю 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;
}
В чем проблема и как ее решить?Спасибо.