2013-03-21 30 views
3

我有一个listview包含很多歌曲。每次点击歌曲时,我都会调用IntentService按顺序下载该歌曲。如何停止一个IntentService同时有很多IntentService正在运行

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

任何人都可以告诉我一个很好的方法来停止IntentService吗?非常感谢你的帮助。

+0

我想通过这个,你杀了第一个随机过程 - 这可以证明吗?如果是这样,那么你需要识别每个进程的PiD,我不太清楚如何做到这一点,但给我一些时间,我想我可以找到一些东西。 – g00dy 2013-03-21 13:48:09

回答

11

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

在你的情况,因为你不能轻易取消与IntentService一个优秀的命令,你可能需要创建IntentService,你有自己的工作队列,一个在那里你有能力创建自己的Service子你自己的版本取消尚未运行的命令。

+0

是的,这似乎是解决我的问题的最好方法。 – anticafe 2013-03-21 14:22:56

+0

IntentService在内部有一个队列,并将连续服务所有这些队列。所以我认为最好的解决方案是使用服务。 – StErMi 2013-03-22 15:01:19

1

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

我通过覆盖onStartCommand()方法(当新的intent到达时调用)来解决它。 当我想关闭一个下载,我开始了新的意图有一个额外的称为“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。

+3

在最新的android引用中,注意到这个方法不应该被覆盖。如果注释被忽略,那么所提到的问题原来的海报是用你的方法解决了什么风险? – 2014-03-28 21:48:23