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

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

intentService下载文件从互联网的背景,但我想能够中止特定的下载………

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

意图服务开始下载数字1,然后第二个等… 1)有没有办法说意图服务中止你在做什么在这个时候在方法处理事件(在这种情况下,下载文件1)并开始下载下一个?

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

不久,我需要一个方法来与队列交stream来执行这2个简单的操作,但我没有发现任何有用的互联网:(

TNX

Solutions Collecting From Web of "Android:intentservice,如何中止或跳过handleintent队列中的任务"

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

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

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

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

到我的IntentService源。

现在,从扩展IntentService的服务中,我想在某个操作(login)传递给服务时清除队列,所以我重写了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); } 

奇迹般有效 :)

希望它可以帮助别人…

我创build了自己的MyIntentService类复制原来的很短,并修改方法为我自己的目的……..特别是出队一个元素,你可以使用ServiceHandler的方法在我的情况
mServiceHandler.removeMessages(APPID);
使用消息队列中的某个代码“what”删除所有待处理消息的post,这意味着您必须标记添加到队列中的每个消息,并在每个消息的“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 

扩展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); } } } 

我知道这个代码的作品,因为我之前testing过,但我不知道这是一个正确的方法来做到这一点!

您可以绑定到intentservice并创build一个方法来取消或解除下载。

这里是你可能需要的快速教程