我正在写不断轮询设备的传感器和每隔一段时间应写下一些统计数据到文件的应用程序。 这可能是一样快,一旦第二或慢一分钟一次。 我应该使用Handler's
postDelayed()
方法或者与调度它AlarmManager
?
Answer 1:
我会说,这取决于轮询间隔。 我想这是相当低的,你的情况(大约几秒钟),所以你应该去处理程序的方式,或通过使用Timer类。
AlarmManger是一个更高层次的服务,它涉及到一个更大的开销来处理这个用例。 当报警触发,你需要BroadcastReceivers来处理它。 这意味着,每一次你处理这些报警的一个时间,你需要为你所感兴趣的传感器,这是非常低效恕我直言注册听众。
Answer 2:
这会帮助你区分Handler
和AlarmManager
。 [资源]
虽然它同意这些大多为API 23.工作这是一个新的版本。
Answer 3:
决定根据以下要点您的设计:
AlarmManager:与优点AlarmManager
是,它的作品,即使设备处于深度休眠模式(CPU处于关闭状态)。 当火警,它击中BroadcastReceiver
和onReceive
,它获得了唤醒锁定(如果你已经使用WAKEUP
类型,如报警RTC_WAKEUP
或ELAPSED_TIME_WAKEUP
)。 完成后onReceive()
它释放之后锁定。
但大多数时候它并没有为我工作。 所以,我在为自己添置了唤醒锁定onReceive()
并将其公布在年底,以确保我真的得到CPU。
为什么它不工作的原因是,当多个应用程序同时使用的资源(比如唤醒锁定的是防止系统挂起),框架纵横交错这些应用程序的CPU消耗,虽然不一定相等。 所以,如果它是至关重要的,它始终是更好地掌握唤醒锁定,做的东西。
计时器和处理程序: Handler
和计时器不会在深度睡眠模式下工作的意义,任务/可运行不会按照日程安排时,该设备是睡着了运行。 他们不计的睡眠时间,这意味着赋予执行任务的延迟将仅在主动模式来计算。 所以,实际的延迟会延迟给予+时间花费,在深睡眠。
Answer 4:
如果应用程序应该在待机工作,然后AlarmManager
。 如果没有,那么Handler
。
AlarmManager
将唤醒CPU,因此它会更耗尽电池,而Handler
将不会在待机工作。