如何强制停止正在进行的意图服务?

时间:2013-04-18 22:07:31

标签: android service intentservice

我有一个意图服务,下载几千兆字节的视频。我有一个“停止”按钮,如果意外点击“开始”或其他什么,停止下载。我知道这已被问过几次,但对我没有合适的答案。

我尝试拨打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);

2 个答案:

答案 0 :(得分:12)

我想有两个不同的问题:

  1. 如何停止当前下载

  2. 如何停止排队下载,应在当前完成后执行

  3. 第一个必须是“像旗子一样”,在下载数据时检查。否则,什么都不会阻止您的下载操作。如果您使用的是典型的HttpUrlConnection食谱,请在循环中检查您从HTTP InputStream读取的标记并写入FileOutputStream。您可以通过调用具有特定startService()结构的Intent来设置该标志,并将其标识为“取消”操作。您需要覆盖onStartCommand()中的IntentService,查看Intent,如果是取消Intent则使用它来设置标记,或者链接到超类{任何其他类型的Intent

    如果您可能有其他排队的命令(场景#2),您还需要在onHandleIntent()的顶部检查该标志。

答案 1 :(得分:2)

鉴于你没有发布 你正在处理视频下载,这可能不起作用(onHandleIntent内部会有一些循环执行下载)。您可以在IntentService内部使用静态类变量来保存下载的停止/启动状态,以便可以通过Activity进行设置。然后,在onHandleIntent内,您必须定期检查状态,以便知道何时取消操作。