Android:intentservice,如何中止或跳过handleintent队列中的任务

时间:2011-09-06 10:49:10

标签: android android-intent queue android-intentservice

我有一个调用意向服务的活动(“ApplicationActivity”)(“DownloadService”)

intentService在后台下载来自互联网的文件,但我希望能够中止特定的下载.........

所以我想说我把5个文件放在队列中:文件1,2,3,4,5

意图服务开始下载数字1,然后是第二个等等.... 1)有没有办法说意图服务中止你在方法句柄事件(在这种情况下下载文件1)中当前正在做什么并开始下载下一个?

2)是否可以从队列中删除元素,例如在下载文件1时,从队列中删除文件4,以便在数字3之后直接进入5?

很快,我需要一种与队列通信来执行这两个简单操作的方法,但我没有在互联网上找到任何有用的东西:(

TNX

5 个答案:

答案 0 :(得分:19)

谢谢@ user280560,我找到了一个基于你评论的解决方案:)

只是为了给出一个更具体的例子,我希望在某些情况下清除队列。

首先我将IntentService.java源代码从here复制到我的项目中(不需要更改名称,你可以保留IntentService.java,只需导入你的而不是android的)。然后我添加了这个

public void clearQueue() {
    Debug.PrintInfo(TAG, "All requests removed from queue");
    mServiceHandler.removeMessages(0);
}

到我的IntentService源。

现在,从我扩展IntentService的服务中,我想在将某个操作(登录)传递给服务时清除队列,所以我重写onStartMethod,如下所示:

@Override
public void onStart(Intent intent, int startId) {
    if(intent.getAction().equals(ACTION_LOGIN)) {
        //Login clears messages in the queue
        clearQueue();
    }
    super.onStart(intent, startId);
}

像魅力一样工作:)

希望它有所帮助...

答案 1 :(得分:12)

我创建了我自己的MyIntentService类,复制了一个非常简短的原始版本并根据自己的目的修改了方法........特别是为了将一个元素出列,你可以在我的案例中使用ServiceHandler的方法
mServiceHandler.removeMessages(APPID);
使用消息队列中的某些代码“what”删除任何待处理的消息帖子,这意味着您必须在队列中添加每条消息,并在每条消息的“what”字段中添加一个标识符... ..例如

public void onStart(Intent intent, int startId) 
{
    super.onStart(intent, startId);
    Message msg = mServiceHandler.obtainMessage();
    msg.arg1 = startId;
    msg.obj = intent;
    msg.what = intent.getIntExtra("appId", 0); \\parameters that come from the outside

答案 2 :(得分:4)

扩展IntentService类并在其上声明已取消项目的列表,并且每当您想要取消某些内容时,请将其添加到此列表中。最后在处理你的意图之前确保它没有被取消!

public class MyDownloadService extends IntentService {
    private static List<String> canceledUrl;

    public static void cancelDownload(String url){
         canceledUrl.add(url);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        if (intent != null) {
            final String url = intent.getStringExtra(EXTRA_URL);

            if(!canceledUrl.contains(url)) //if download has not been canceled already
                downloadFile(url);
            else
                canceledUrl.remove(url);
        }
    }
}

我知道这段代码是有效的,因为我之前测试过,但我不确定它是否是正确的方法!

答案 3 :(得分:1)

您可以绑定到intentservice并创建一个取消或取消下载的方法。

Here是您可能需要的快速教程

答案 4 :(得分:0)

如上面的@JeffreyBlattman所说,最好通过为此消息分配您自己的“什么”值来保证安全

@Override
    public void onStart(@Nullable Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        msg.what = 0;
        mServiceHandler.sendMessage(msg);
    }

并清除队列,如mServiceHandler.removeMessages(0)

希望有所帮助。