15

我正在编写一个不断轮询设备传感器的应用程序,并且每隔一段时间应该将一些统计信息写入文件。这可能快到一秒钟一次,也可能慢到一分钟一次。我应该使用Handler's postDelayed()方法还是只安排它AlarmManager

4

4 回答 4

24

这应该可以帮助您区分HandlerAlarmManager[来源]

尽管已经同意这些主要适用于 API 23。这是一个新版本。

后台工作、警报和您的 Android 应用程序的流程图

于 2015-09-24T09:57:22.727 回答
15

如果应用程序应该在待机状态下工作,那么AlarmManager. 如果没有那么Handler
AlarmManager将唤醒 CPU,因此它将消耗更多电池,而Handler在待机状态下将无法工作。

于 2012-11-05T09:35:54.237 回答
13

根据以下关键点确定您的设计:

AlarmManager: 它的优点AlarmManager是即使设备处于深度睡眠模式(CPU 关闭)它也能正常工作。当闹钟触发时,它会点击BroadcastReceiverand in onReceive,它会获取唤醒锁(如果您使用WAKEUP过类似RTC_WAKEUPor的闹钟类型ELAPSED_TIME_WAKEUP)。完成后onReceive()它会释放唤醒锁。

但大多数时候它对我不起作用。因此,我获得了自己的唤醒锁,onReceive()并在最后释放它们以确保我真正获得 CPU。

它不起作用的原因是当多个应用程序同时使用一个资源(例如阻止系统挂起的唤醒锁)时,框架会在这些应用程序之间分配 CPU 消耗,尽管不一定相等。因此,如果它很关键,最好获取唤醒锁并执行此操作。

定时器和处理程序: Handler定时器不能在深度睡眠模式下工作,这意味着当设备处于睡眠状态时,任务/可运行项将不会按计划运行。它们不计算睡眠时间,这意味着执行任务的延迟将仅在活动模式下计算。因此,实际延迟将是延迟给定 + 深度睡眠所花费的时间。

于 2014-11-04T17:03:23.673 回答
2

我会说这取决于轮询间隔。我想在你的情况下它相当低(大约几秒钟),所以你应该采用 Handler 方式,或者使用 Timer 类。

AlarmManger 是一个更高级别的服务,处理此用例涉及更大的开销。当警报触发时,您需要使用 BroadcastReceivers 进行处理。这意味着每次处理其中一个警报时,您都需要为您感兴趣的传感器注册侦听器,恕我直言,这是非常低效的。

于 2012-11-05T09:10:01.970 回答