在android中保持服务活着

时间:2011-07-28 10:20:52

标签: java android service keep-alive

我创建了一个基本上执行以下操作的Android服务:

schedule a task, using the ScheduledThreadPoolExecutor.schedule() method
when the schedule time is reached, the task is executed and a new schedule is started

因此,服务连续有一个计时器(执行任务期间除外);有时2个(独立)计时器到位,具体取决于任务的结果。该服务应始终运行并不时执行不同的任务。

一切似乎都运行正常(至少在运行DDMS时),但过了一段时间(类似于没有通过DDMS连接设备的一小时),计时器任务不再执行。让它再次工作的唯一方法是再次停止和启动服务,或者通过将设备与DDMS连接(使用Eclipse);唤醒设备只会触发此操作。

看起来,Android将服务设置为一种睡眠模式(在查看设备上的Active Services时服务仍在运行)。

我的问题是:如何防止此行为并始终保持服务正常运行?

我做了一些研究,通过在服务中获取(PARTIAL_WAKE_LOCK)WakeLock,我找到了理论上可以提供解决方案的东西,但据我所知,使用这个解决方案,我必须获取onStartService的锁定( )方法并在onDestroy()中释放它,这意味着我在服务的生命周期内保持锁定(这是永久的);我怀疑使用这种方法排水。

还有另一种方法可以实现同样的目标吗?

4 个答案:

答案 0 :(得分:1)

由于上面的回复,我已经解决了这个问题。

我从ScheduledPoolThreaExecutor()切换到AlarmManager。与RTC_WAKEUP类型一起,现在处理所有触发器。

我没有使用IntentService,因为我的服务必须根据警报并行执行(并且IntentService实现了排队解决方案)。原始服务在原始实现中始终保持活动状态,现在仅在触发警报时才会创建。

我也有这样的印象(但这只是一种直觉,不是基于真实的测量,这个新的实现(在需要时创建服务并且一直不活动(等待计时器均衡))甚至可以更好地延长设备的电池寿命。

答案 1 :(得分:0)

您需要多长时间执行一次,并且一直运行是什么意思?我想你并不是说一直都在执行?

我有一项服务可以做到这一点,而且效果很好:

它使用警报管理器安排警报。触发警报时获取唤醒锁,执行一些工作,然后在释放唤醒锁之前安排新警报。

答案 2 :(得分:0)

将IntentService用于您的服务实现,并使用AlarmManager注册挂起的意图,以便在您需要的时间内触发这些意图。

答案 3 :(得分:0)

之前我在应用程序中使用了唤醒锁,我不需要在onDestroy()中释放它们, 我确实有以下内容,它完美地运作:

onClockListener{
   acquire wakelock
   method call
}

otherOnClickListener{
   release wakelock
   other method call
}

不确定它是否有用,但如果我不发布任何东西它绝对不会有帮助:)