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

urS*_*Sus 12 service android 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;
            }

            ...
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

然后触发它

Intent intent = new Intent(context, SyncService.class);
intent.putExtra("action", "cancel");
context.startService(intent);
Run Code Online (Sandbox Code Playgroud)

Com*_*are 12

你会有两个不同的问题,我想:

  1. 如何停止当前下载

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

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

如果您还有其他排队的命令(场景#2),您还需要检查顶部的那个标志onHandleIntent().