我正在编写一个不断轮询设备传感器的应用程序,并且经常会将一些统计信息记录到文件中。这可能是每秒一次或每分钟一次慢。我应该使用Handler's
postDelayed()
方法还是仅使用AlarmManager
安排方法?
答案 0 :(得分:17)
答案 1 :(得分:11)
根据以下要点确定您的设计:
<强> AlarmManager:强>
AlarmManager
的优点是即使设备处于深度睡眠模式(CPU关闭)也能正常工作。当警报触发时,它会点击BroadcastReceiver
并在onReceive
中,它会获取唤醒锁定(如果您使用了WAKEUP
类型的警报,例如RTC_WAKEUP
或{{1} })。完成ELAPSED_TIME_WAKEUP
后,它会释放唤醒锁。
但大多数时候它对我来说都不适用。所以我在onReceive()
中获得了自己的唤醒锁,并在最后释放它们以确保我真正获得CPU。
它不工作的原因是当多个应用程序同时使用资源(例如阻止系统挂起的唤醒锁定)时,框架会在这些应用程序之间传播CPU消耗,尽管不一定相同。因此,如果它是关键的,那么获取唤醒锁并做这些事情总是更好。
计时器和处理程序:
onReceive()
和计时器在深度睡眠模式下不起作用,这意味着当设备处于睡眠状态时,任务/可运行不会按照计划运行。它们不计算睡眠时间,这意味着执行任务的延迟仅在活动模式期间计算。因此,实际延迟将是延迟给定+深度睡眠时间。
答案 2 :(得分:9)
如果应用应该处于待机状态,那么AlarmManager
。如果不是那么Handler
AlarmManager
会唤醒CPU因此会耗尽更多电量,而Handler
将无法在待机状态下工作。
答案 3 :(得分:2)
我会说它取决于轮询间隔。我猜你的情况相当低(大约几秒钟),所以你应该采用Handler方式,或者使用Timer类。
AlarmManger是一个更高级别的服务,它涉及更大的开销来处理这个用例。当警报触发时,您需要使用BroadcastReceivers处理它。这意味着每次处理其中一个警报时,您需要为您感兴趣的传感器注册监听器,这非常低效。