我创建了一个基本上执行以下操作的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()中释放它,这意味着我在服务的生命周期内保持锁定(这是永久的);我怀疑使用这种方法排水。
还有另一种方法可以实现同样的目标吗?
答案 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
}
不确定它是否有用,但如果我不发布任何东西它绝对不会有帮助:)