我应该使用AlarmManager还是Handler?

Moi*_*nez 13 android alarmmanager android-handler

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

msy*_*ilu 19

这应该有助于你区分HandlerAlarmManager. [资源]

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

后台工作,闹钟和Android应用的流程图


cgr*_*cgr 12

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

AlarmManager: 它的优点AlarmManager是即使设备处于深度睡眠模式(CPU关闭)也能正常工作.当警报触发时,它会触发BroadcastReceiver并进入onReceive,它会获取唤醒锁定(如果您使用过WAKEUP类型的警报,RTC_WAKEUP或者ELAPSED_TIME_WAKEUP).完成后,onReceive()它会释放唤醒锁.

但大部分时间它都不适合我.所以我已经获得了自己的唤醒锁onReceive()并在最后释放它们以确保我真正获得CPU.

它不能工作的原因是,当多个应用程序同时使用资源(例如阻止系统挂起的唤醒锁定)时,框架会在这些应用程序之间传播CPU消耗,尽管不一定相同.因此,如果它是关键的,那么获取唤醒锁并做这些事情总是更好.

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


paw*_*eba 11

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

  • 我刚刚找到了更详细的类似答案:http://stackoverflow.com/a/5120225/538169 (2认同)

Zso*_*agy 2

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

AlarmManger 是一个更高级别的服务,处理此用例需要更大的开销。当警报触发时,您需要使用广播接收器来处理它。这意味着每次处理这些警报之一时,您都需要为您感兴趣的传感器注册侦听器,恕我直言,这是非常低效的。