【发布时间】:2012-10-25 02:18:27
【问题描述】:
我正在编写一个应用程序,它会不断地轮询设备的传感器,并且应该经常将一些统计信息写入文件。这可能快到一秒钟一次,也可能慢到一分钟一次。我应该使用Handler'spostDelayed()方法还是只使用AlarmManager安排它?
【问题讨论】:
标签: android alarmmanager android-handler
我正在编写一个应用程序,它会不断地轮询设备的传感器,并且应该经常将一些统计信息写入文件。这可能快到一秒钟一次,也可能慢到一分钟一次。我应该使用Handler'spostDelayed()方法还是只使用AlarmManager安排它?
【问题讨论】:
标签: android alarmmanager android-handler
我会说这取决于轮询间隔。我想你的情况相当低(大约几秒钟),所以你应该采用 Handler 方式,或者使用 Timer 类。
AlarmManger 是一种更高级别的服务,处理此用例需要更大的开销。当警报触发时,您需要使用 BroadcastReceivers 进行处理。这意味着每次您处理其中一个警报时,您都需要为您感兴趣的传感器注册侦听器,恕我直言,这是非常低效的。
【讨论】:
如果应用程序应该在待机状态下工作,那么AlarmManager。如果不是,那么Handler。AlarmManager 将唤醒 CPU,因此它会消耗更多电池,而Handler 将无法在待机状态下工作。
【讨论】:
根据以下关键点决定您的设计:
报警管理器:
AlarmManager 的优点是即使设备处于深度睡眠模式(CPU 关闭)它也能正常工作。当警报触发时,它会触发BroadcastReceiver 并在onReceive 中获取唤醒锁(如果您使用过WAKEUP 类型的警报,例如RTC_WAKEUP 或ELAPSED_TIME_WAKEUP)。完成onReceive() 后,它会释放唤醒锁。
但大多数时候它对我不起作用。所以我在onReceive() 中获得了自己的唤醒锁,并在最后释放它们以确保我真的获得了 CPU。
它不起作用的原因是当多个应用程序同时使用一个资源(例如阻止系统挂起的唤醒锁)时,框架会在这些应用程序之间分配 CPU 消耗,尽管不一定相等。因此,如果它很关键,最好获取唤醒锁并执行此操作。
计时器和处理程序:
Handler 和计时器在深度睡眠模式下不工作,这意味着当设备处于睡眠状态时,任务/可运行项将不会按计划运行。它们不计算睡眠时间,这意味着执行任务的延迟将仅在活动模式下计算。因此,实际延迟将是 delay-given + time-spent-in-deep-sleep。
【讨论】:
【讨论】: