当有许多IntentService正在运行时,如何停止一个IntentService

时间:2013-03-21 13:45:35

标签: android service download intentservice

我有一个listview包含很多歌曲。每次点击一首歌曲时,我都会调用一个IntentService来按顺序下载这首歌。

但有时我想取消下载(例如:第5次)。这意味着我需要停止第5次运行的IntentService。我试图通过调用stopService()来阻止它,但它不起作用。

有人能告诉我一个停止IntentService的好方法吗?非常感谢你的帮助。

2 个答案:

答案 0 :(得分:12)

清单中每个IntentService元素只有一个正在运行<service>。如果您拨打startService()六次,则最多只有一个IntentService正在运行。如果onHandleIntent()在发送另一个命令时正在处理命令,则命令将按IntentService排队并一次处理一个。

在您的情况下,由于您无法轻松取消IntentService的未完成命令,因此您可能需要创建自己的IntentService版本,在其中创建自己的Service子类它自己的工作队列,您可以在其中取消尚未运行的命令。

答案 1 :(得分:1)

使用intentservices下载时遇到了同样的问题。 在我的应用程序中,每个下载都有自己的通知,点击它时我想停止下载。

我通过重写onStartCommand()方法(在新意图到来时调用)解决了这个问题。 当我想关闭一个下载时,我开始了一个带有额外名为“stopid”的新意图:

Intent stopIntent = new Intent(DialogActivity.this,DownloadIntentService.class);
stopIntent.putExtra("stopid", id);
startService(stopIntent);

onStartCommand()方法如下所示:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    int id = intent.getExtras().getInt("stopid");
    if(id!=0) {
        stopList.add(id);
    }
    return super.onStartCommand(intent, flags, startId);
}

对于正常意图,只需将下载的ID作为额外的意图。 在onHandle()方法中进行下载时,经常检查stopList是否包含当前下载意图的id。如果是,请停止下载并从stopList中删除id。