在后台运行的服务中,使用WakeLock还是startForeground更好?

4

承认我只是在这里进行一些hack,因此我希望了解一些知识。

我有一个后台运行的服务,连接到另一个线程,倒计时计时器。我遇到了倒计时在一段时间后停止的问题,并且推测是由于服务垃圾收集引起的。使用startForeground我似乎已经解决了这个问题(并且看不到真正的电池使用)。现在我了解到了wakelocks,是否有任何关于何时使用其中一个的最佳实践呢?

谢谢!

1个回答

2
我有一个在后台运行的服务,与另一个线程连接,用于倒计时。请使用AlarmManager,这样您的服务只需要在实际工作时才需要在内存中,而不仅仅是观察时钟滴答声。Android最大的用户投诉之一是所有这些开发人员创建的后台任务使他们的手机变得缓慢。
我似乎已经通过使用startForeground解决了问题(并且看不到真正的电池使用情况)。startForeground的目的是表明您的服务正在持续向用户提供价值,以便用户会注意到如果由于挂起太长或低内存条件而重新获取服务。坐着看时钟滴答声并不是“持续为用户提供价值”。请使用AlarmManager,您将不需要startForeground。
现在我了解了唤醒锁,是否有任何关于何时使用其中之一的最佳实践?WakeLock使CPU保持通电状态(可能还包括屏幕)。它与startForeground没有什么关系。如果您使用AlarmManager,根据您正在执行的工作,您可能需要WakeLock来确保设备在执行周期性工作时保持唤醒状态。

startForeground() 的目的是指示您的服务正在持续向用户提供价值,以便用户会注意到如果服务因挂起时间过长或低内存条件而被回收。坐着看时钟滴答声并不是“持续向用户提供价值”。请使用 AlarmManager,您将不需要 startForeground()。但是,我同时注册了加速度计的点击,并在每次获取读数时重置时钟。所以我确实需要它同时打开。我会研究 Alarm Manager。 - Jackie
@Jackie:“我正在同时注册加速度计的点击,并在每次获取读数时重置时钟”--不清楚为什么这是一个服务。设备必须始终处于开机状态才能使用传感器。传感器设计用于从前台活动中使用。无论如何,AlarmManager在这里都没有帮助。但是,如果您想防止设备进入睡眠状态以便读取传感器,则需要WakeLock - CommonsWare
设备在使用传感器时必须始终保持通电状态。我不认为这是正确的,因为如果是这样的话,我想我应该会看到更多的电池耗尽。目前似乎工作正常。 - Jackie
2
@Jackie:你假设所有设备都是相同的。特别是对于传感器,你是错误的,因为其他开发者在这个问题上有很多抱怨。再次强调,传感器被设计用于前台活动,而不是后台服务。 - CommonsWare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接