我有一个包含许多歌曲的列表视图。每次点击一首歌,我都会调用一个 IntentService 来按顺序下载这首歌。
但有时我想取消下载(例如:第 5 次)。这意味着我需要停止第 5 个正在运行的 IntentService。我试图通过调用 stopService() 来停止它,但它不起作用。
谁能告诉我停止 IntentService 的好方法?非常感谢你的帮助。
我有一个包含许多歌曲的列表视图。每次点击一首歌,我都会调用一个 IntentService 来按顺序下载这首歌。
但有时我想取消下载(例如:第 5 次)。这意味着我需要停止第 5 个正在运行的 IntentService。我试图通过调用 stopService() 来停止它,但它不起作用。
谁能告诉我停止 IntentService 的好方法?非常感谢你的帮助。
清单中的IntentService
每个元素只有一个 running 。<service>
如果您调用startService()
六次,最多IntentService
将运行一次。onHandleIntent()
如果在IntentService
发送另一个命令时正在处理一个命令,则命令将排队并一次处理一个。
在您的情况下,由于您无法轻松取消未完成的命令IntentService
,因此您可能需要创建自己的版本IntentService
,在其中创建Service
具有自己的工作队列的自己的子类,您可以在其中取消尚未完成的命令跑步。
我在使用意图服务下载时遇到了同样的问题。在我的应用程序中,每次下载都有自己的通知,单击它时我想停止下载。
我通过覆盖 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。