我正在编写一个应用程序,它会不断轮询设备的传感器,并且每隔一段时间需要将一些统计信息写入文件。这可能快到每秒一次,也可能慢到每分钟一次。我应该使用 Handler
的 postDelayed()
方法还是仅使用 AlarmManager
进行安排?
我正在编写一个应用程序,它会不断轮询设备的传感器,并且每隔一段时间需要将一些统计信息写入文件。这可能快到每秒一次,也可能慢到每分钟一次。我应该使用 Handler
的 postDelayed()
方法还是仅使用 AlarmManager
进行安排?
AlarmManager
。如果不需要,则使用 Handler
。AlarmManager
会唤醒 CPU,因此会更耗电,而 Handler
在待机状态下无法工作。根据以下关键点决定你的设计:
AlarmManager:
AlarmManager
的优点是即使设备处于深度睡眠模式(CPU关闭),它也能工作。当警报触发时,它会击中BroadcastReceiver
,并在onReceive
中获取唤醒锁(如果你使用了WAKEUP
类型的警报,如RTC_WAKEUP
或ELAPSED_TIME_WAKEUP
)。在完成onReceive()
之后,它会释放唤醒锁。
但大多数情况下,它对我来说都不起作用。因此,在onReceive()
中,我已经自己获取了唤醒锁,并在最后释放它们,以确保我真正获得了CPU。
原因是当多个应用程序同时使用资源(例如可以防止系统挂起的唤醒锁)时,框架会在这些应用程序之间分配CPU消耗,但不一定均匀。因此,如果很重要,最好获取唤醒锁并完成任务。
计时器和Handler:
Handler
和计时器不能在深度睡眠模式下工作,这意味着当设备处于睡眠状态时,任务/可运行项将不会按计划运行。它们不计算睡眠时间,这意味着分配给执行任务的延迟仅在活动模式下计算。因此,实际延迟将是延迟给定的时间 + 在深度睡眠中花费的时间。
我认为这取决于轮询间隔。我猜你的轮询间隔相当低(大约几秒钟),因此你应该采用Handler方法或使用Timer类。
AlarmManager是一个更高级别的服务,它涉及更大的开销来处理这个用例。当闹钟触发时,你需要使用BroadcastReceivers来处理它。这意味着每次处理这些闹钟时,你需要注册对你感兴趣的传感器的监听器,这在我看来极其低效。