0

好吧,这个问题与我所问的基本相似,我尝试在每 1 秒运行一次可运行的服务上使用计时器,该可运行可更新其他活动中的某些 UI。

此活动可以在后台运行或停止,但服务不能停止倒计时,正如附加问题中的人所说,我有时也会在唤醒手机时同时运行所有可运行文件。

他得到的答案是使用 AlarmManager,但 Android 文档不鼓励使用 AlarmManager 来处理超时和滴答声,并建议使用处理程序,所以有人举了一个例子来说明它是如何正确使用处理程序的吗?

请注意,当手机进入睡眠状态时问题开始出现,并且仅在一段时间后,Timer 可以正常工作 30 分钟,但几个小时内它不会...

4

2 回答 2

1

几个概念...

睡眠模式

WAKE_LOCK如果没有用户交互或请求,Android 内核将进入睡眠模式(默认情况下) 。这样做是为了最大限度地减少电池利用率,这意味着任何代码都将停止运行。

报警管理器

这是一个可以设置 timmer 事件以唤醒内核并开始运行代码的 API。如果应用程序需要执行一些长时间的活动,它应该请求唤醒舔,否则内核将在短时间内再次进入睡眠模式。

您的应用程序发生了什么

一旦设备进入睡眠状态,您的服务就会停止。当设备被用户或手机中其他应用程序发出的警报管理器请求唤醒时,您的服务将再次启动。当手机再次进入睡眠状态时,您的服务也会进入睡眠状态。

你应该做什么

首先,您应该仔细考虑是否真的需要在手机一段时间未使用时(何时应该进入睡眠模式)进行更新。也许没有人在使用它,并且让服务持续运行,会不断消耗电池。

如果您不需要该服务持续运行,您有 2 个选项:

使用警报管理器

以固定的间隔时间唤醒设备(使用尽可能低的频率)并更新您的服务工作。如果这需要一些时间,请请求 aWAKE_LOCK并在完成后释放它。

最后使用

如果您可以等待用户唤醒手机以更新您的服务工作,那就更好了。只需删除除最后一个之外的所有更新请求。

最后

如果您确实需要服务持续运行,请WAKE_LOCK在服务启动时请求。只是不要忘记您将在电池现场支付。

Note:不管您使用 a还是其他任何东西TimerHandler上述内容都将始终适用。

问候。

于 2012-11-21T20:25:49.633 回答
-1

您可以尝试ScheduledExecutor

于 2012-11-21T19:16:14.330 回答