【问题标题】:Android: Use AlarmManager to repeatedly call service that sometimes lasts longer than the repeat intervalAndroid:使用AlarmManager重复调用有时持续时间超过重复间隔的服务
【发布时间】:2013-04-15 23:54:50
【问题描述】:

我想每 15 分钟启动一次服务。大多数情况下它会在大约 30 秒内退出,但有时服务会持续超过 15 分钟。如果之前的服务调用仍在运行,我认为警报管理器启动服务并不好。我正在考虑在 onStartCommand 中设置一个标志,以便在服务正在运行时让它简单地返回而不做任何事情。但我不确定这是否是处理它的最佳方式,因为 onStartCommand 返回一个 int 并且我不知道系统需要这个值。有没有最好的方法来做到这一点?

【问题讨论】:

  • 但是我从 (stackoverflow.com/questions/13124115/…) CommonsWare 那里听说:“不,它不会创建新服务。如果服务已经在运行,它将再次使用 onStartCommand() 调用,以交付新的 Intent,但没有创建第二个副本。”新意图会做什么?
  • 我明白了。但是,如果我不希望该服务在下一次应该被调用之前重新启动呢?

标签: android service alarmmanager


【解决方案1】:

但是我从 CommonsWare 那里听说:“不,它不会创建新服务。如果服务已经在运行,它将再次使用 onStartCommand() 调用,以传递新的 Intent,但第二个副本不是创建的。”

是的,CommonsWare 那个家伙,他确实写了很多... :-)

如果之前的服务调用仍在运行,我认为警报管理器启动服务并不好。

如果您使用IntentService,这将不是问题。来自您的第二个警报的命令将被排队,等待 onHandleIntent() 从第一个警报结束。

如果您没有使用IntentService,则需要在onStartCommand() 中有智能,以确定您自己的线程仍在运行,因此您想跳过该命令。

但我不确定这是否是处理它的最佳方式,因为 onStartCommand 返回一个 int,我不知道系统需要这个值。

这与您的问题没有任何关系。只需返回 super.onStartCommand(),或您当前的 onStartCommand() 方法返回的任何内容。

但是,如果我不想让服务在下一次应该被调用之前重新启动呢?

好吧,您可以用一次性警报替换重复警报(使用set()),然后设置下一个警报,作为对上一个警报的工作的一部分。

【讨论】:

  • 谢谢。能从马口中得到就好了(我有你的两本书)!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
相关资源
最近更新 更多