【问题标题】:How to stop one IntentService while there are many IntentService are running如何在有许多 IntentService 正在运行时停止一个 IntentService
【发布时间】:2013-03-21 13:45:35
【问题描述】:

我有一个包含许多歌曲的列表视图。每次点击一首歌,我都会调用一个 IntentService 来按顺序下载这首歌。

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

谁能告诉我停止 IntentService 的好方法?非常感谢您的帮助。

【问题讨论】:

  • 我猜你会杀死第一个随机进程 - 这可以证明吗?如果是这样,那么您需要识别每个进程的 PiD,我不太确定该怎么做,但给我一些时间,我想我可以找到一些东西。

标签: android service download intentservice


【解决方案1】:

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

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

【讨论】:

  • 是的,这似乎是解决我的问题的最佳方法。
  • IntentService 内部有一个队列,并将依次为所有队列提供服务。所以我认为对你来说最好的解决方案是使用服务。
【解决方案2】:

我在使用 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。

【讨论】:

  • 在最新的android参考中,注意到这个方法不应该被覆盖。如果忽略注释并使用您的方法解决原始发布者提到的问题会有什么风险?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多