我有一个调用意向服务的活动(“ApplicationActivity”)(“DownloadService”)
intentService在后台下载来自互联网的文件,但我希望能够中止特定的下载.........
所以我想说我把5个文件放在队列中:文件1,2,3,4,5
意图服务开始下载数字1,然后是第二个等等.... 1)有没有办法说意图服务中止你在方法句柄事件(在这种情况下下载文件1)中当前正在做什么并开始下载下一个?
2)是否可以从队列中删除元素,例如在下载文件1时,从队列中删除文件4,以便在数字3之后直接进入5?
很快,我需要一种与队列通信来执行这两个简单操作的方法,但我没有在互联网上找到任何有用的东西:(
TNX
答案 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)
。
希望有所帮助。