Ho un servizio intent che scarica diversi gigabyte di video. Ho un pulsante "Stop", per interrompere il download se colpisci accidentalmente "Start" o qualsiasi altra cosa. So che questo è stato chiesto un paio di volte ma senza una risposta funzionante per me.Come forzare l'arresto di Intent Service in corso?
Provo a chiamare stopService()
, non funziona. Questo chiama solo IntentService.OnDestroy()
. Ho provato a chiamare stopSelf()
all'interno di onDestroy
, non funziona neanche.
Ho provato ad avere qualcosa come una bandiera, ma onHandleIntent non viene chiamato se è già in esecuzione, attende fino a quando il lavoro corrente è terminato e viene eseguito. E anche se questo avrebbe funzionato, avrei dovuto avere qualcosa di simile a una dichiarazione gigante, che fa schifo
La mia unica opzione è davvero quella di riscriverlo a un servizio regolare?
// Risposta
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;
}
...
}
}
}
e innescare con
Intent intent = new Intent(context, SyncService.class);
intent.putExtra("action", "cancel");
context.startService(intent);
Si potrebbe considerare di rimuovere la soluzione dalla domanda e invece di fornirla come soluzione. – jbaums