【问题标题】:Stop background service only if no more work只有在没有更多工作时才停止后台服务
【发布时间】:2018-10-25 23:12:35
【问题描述】:

我使用服务在后台处理带有ContentResolver 的意图。 每个新的意图调用都会启动服务,一旦处理结束,服务就会自行停止。

这会产生一个问题,即新意图启动服务运行但之前的服务运行仍在处理中,从而导致新运行在其处理结束之前终止。

我考虑在服务中添加某种静态“nunInstances”并仅停止它的 1。

另一个选项是让服务继续运行。我曾尝试寻找有关它的有效性和副作用的信息,但没有找到。

【问题讨论】:

标签: android android-service


【解决方案1】:

您可以使用IntentService,它充当工作队列。您可以根据需要多次发送与startService() 相关的工作。这项工作是按顺序进行的,一个接一个。当最后一个工作单元执行完毕后,Service 会自行停止。

或者您使用普通的Service 并自己在onStartCommand() 中排队工作。当您没有更多工作要做时,您可以拨打stopSelf()

注意:Android 不会创建多个Service 的实例。您不必担心运行多个Service 实例。如果调用startService() 并且Service 已经在运行,Android 不会创建Service 的新实例。它只是在正在运行的实例上调用onStartCommand(),并将Intent 作为参数传递。

【讨论】:

  • 感谢您的回答。我提到的实例数实际上是作业队列长度(错误命名),解决方案听起来非常好,我只是想知道,如果我永远不会调用 stopSelf() 会发生什么?
  • 这取决于您从onStartCommand() 返回的内容。如果您返回START_STICKY,Android 将在您的Service 被杀死时自动重新启动它。但是,您可以返回其他值,如果 Service 被杀死,Android 将不会重新启动它。
  • 但是可以让我的Service 一直保持活动状态(假设我使用START_NOT_STICKY 并且从不调用stopSelf() 吗?
  • 在不需要的时候关闭它会更好。但 Android 会为您做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 2019-03-04
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 2019-09-04
相关资源
最近更新 更多