Имам услуга за намерения, която изтегля няколко гигабайта видеоклипове. Имам бутон "Стоп", за да спра изтеглянето, ако случайно натиснете "Старт" или каквото и да е друго. Знам, че това е задавано няколко пъти, но без работещ отговор за мен.
Опитвам се да се обадя на stopService()
, не става. Това просто извиква IntentService.OnDestroy()
. Опитах се да извикам stopSelf()
вътре в onDestroy
, също не работи.
Опитах се да имам нещо като флаг, но onHandleIntent не се извиква, ако вече се изпълнява, изчаква текущата работа да приключи и тогава се изпълнява. И дори ако това щеше да проработи, трябваше да имам нещо като гигантско if изявление, това е гадно
Единствената ми възможност наистина ли е да го пренапиша на обикновен сервиз?
//Отговор
public class SyncService extends IntentService {
boolean isCanceled;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent.hasExtra("action")) {
// Set the canceling flag
isCanceled= intent.getStringExtra("action").equals("cancel");
}
return super.onStartCommand(intent, flags, startId);
}
@Override
protected void onHandleIntent(Intent intent) {
// Clean up the possible queue
if (intent.hasExtra ("action")) {
boolean cancel = intent.getStringExtra ("action"). Equals ("cancel");
if (cancel) {
return;
}
}
...
Get your inputStream from HttpUrlConnection or whatever
...
while ((bytesRead = in.read(buffer)) > 0) {
if (isCanceled) {
isCanceled = false;
break;
}
...
}
}
}
И го задействайте с
Intent intent = new Intent(context, SyncService.class);
intent.putExtra("action", "cancel");
context.startService(intent);