我应该使用AlarmManager还是Handler?

时间:2012-11-05 09:01:48

标签: android alarmmanager android-handler

我正在编写一个不断轮询设备传感器的应用程序,并且经常会将一些统计信息记录到文件中。这可能是每秒一次或每分钟一次慢。我应该使用Handler's postDelayed()方法还是仅使用AlarmManager安排方法?

4 个答案:

答案 0 :(得分:17)

这可以帮助您区分HandlerAlarmManager[source]

虽然一致认为这些主要适用于API 23.这是一个新版本。

A flowchart for background work, alarms, and your Android app

答案 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处理它。这意味着每次处理其中一个警报时,您需要为您感兴趣的传感器注册监听器,这非常低效。