Ich habe einen Intent-Dienst, der mehrere Gigabyte an Videos herunterlädt. Ich habe eine "Stop" -Taste, um den Download zu stoppen, wenn ich versehentlich "Start" oder was auch immer drücke. Ich weiß, das wurde ein paar Mal gefragt, aber ohne funktionierende Antwort für mich.So erzwingen Sie den Stopp Intent Service läuft?
Ich versuche stopService()
aufzurufen, funktioniert nicht. Das ruft nur . Ich habe versucht, stopSelf()
innerhalb onDestroy
aufzurufen, funktioniert auch nicht.
Ich habe versucht, so etwas wie eine Flagge zu haben, aber onHandleIntent wird nicht aufgerufen, wenn es bereits läuft, es wartet bis die aktuelle Arbeit beendet ist und dann ausgeführt wird. Und selbst wenn das geklappt hätte, müsste ich sowas wie einen gigantischen if Statement haben, der saugt
Ist meine einzige Option wirklich das umschreiben auf einen regulären Service?
//
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;
}
...
}
}
}
Antwort und lösen sie mit
Intent intent = new Intent(context, SyncService.class);
intent.putExtra("action", "cancel");
context.startService(intent);
Sie könnten in Erwägung ziehen, Ihre Lösung aus Ihrer Frage zu entfernen und stattdessen als Lösung zur Verfügung zu stellen. – jbaums