【问题标题】:how to keep an Intent service running如何保持 Intent 服务运行
【发布时间】:2012-10-14 00:05:45
【问题描述】:

我有两个 Intentservice 示例。一个是commonsware book 中的Download example。另一个在http://www.vogella.com/articles/AndroidServices/article.html#servicecommunication_handler。 这两个示例都显示了服务正在执行一个有限的任务,并且它们显然都通过运行到 onHandleIntent 事件范围的末尾来破坏自己。

我正在编写的服务必须有事件和监听。一种是监听 GPS 运动的 LocationListener。另一个将 Posts 发送到 REST 服务并监听回复。我希望它一直运行到经过一段时间或直到它被启动它的活动告知退出。

如何保持运行?例如,我应该将 LocationListener 的实现放在哪里? 谢谢,加里

【问题讨论】:

  • 即使我需要对同一个问题的答案,在我的情况下,我正在从小部件启动手电筒,但它被杀死了。

标签: android service commonsware


【解决方案1】:

如何让它继续运行?

你没有。 IntentService 旨在完成一项工作(或者可能是队列外的一些工作,如果命令碰巧快速进入),然后关闭。

我正在编写的服务必须有事件和监听。

那么你不应该使用IntentService。使用常规的Service,并根据需要使用您自己的后台线程。

【讨论】:

  • 有人能限定这个答案吗? IntentService 是 Service 的子类,那么为什么应该只使用后者(在新线程中)进行长时间运行/持续的操作??
  • @ban-geoengineering:主要与 Google 工程师讨论。
  • 它没有记录在任何地方吗?
  • 这不是真的。你可以在 IntentService 中做任何你会在常规服务中做的事情。它所做的只是为执行 HandleIntent 的线程提供消息队列。您仍然可以将服务放在前台。
  • @SergeyA:“它所做的只是为执行 HandleIntent 的线程提供消息队列。” -- 并在工作完成后立即关闭。这就是为什么计算机程序员将它用于事务性工作的原因。当然欢迎您使用startForeground() 进行该交易。但问题是关于LocationListener;这本质上是异步的,因此不适合IntentService
【解决方案2】:

要保持服务运行,您的服务需要在服务方法onStartCommand() 中返回START_STICKY

这样,即使您退出活动,服务也会运行。

注意: 如果服务不是前台服务,Android 仍会在一段时间后(30 分钟到 1 小时)终止服务。使用startForeground(notification) 使其成为前景。

祝你好运

【讨论】:

  • 这里没有解释如何无限期地运行 IntenService。
【解决方案3】:

您可以通过两种方式中的任何一种来实现这一点,

AlarmManager 是 android 的内置类,可让您在特定时间周期内执行特定操作。

TimerTask 与 AlarmManager 做同样的事情,你可以一次又一次地重复你的代码的某些动作。

但是,AlarmManager 在执行中更轻松,所以我建议您使用 AlarmManager 类。

创建一个获取 GPS 坐标并定期将其发布到服务器的 AlarmManager。

看看这个AlarmManager Example

【讨论】:

  • 您的任何建议都不会阻止 IntentService 被破坏。如果不等待 handleIntent 方法,就无法让它保持活动状态。
  • @bluewhile 我认为 Lucifer 基本上是在为这个特定任务提供使用 IntentService 的替代方案。
猜你喜欢
  • 2011-07-15
  • 2018-05-11
  • 2012-08-14
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 2017-05-29
  • 1970-01-01
相关资源
最近更新 更多