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

Sgo*_*nks 15 queue android android-intent android-intentservice

我有一个调用意图服务的活动("ApplicationActivity")("DownloadService")

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

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

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

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

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

TNX

Joa*_*usa 19

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

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

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

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

到我的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);
}
Run Code Online (Sandbox Code Playgroud)

奇迹般有效 :)

希望它可以帮助某人......

  • 你应该在消息中明确地指定`what`字段,而不是假设它的值是0.在源中没有使用什么`因此为了你自己的目的使用它应该是安全的. (5认同)

Sgo*_*nks 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
Run Code Online (Sandbox Code Playgroud)


Rez*_*adi 5

扩展 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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