【问题标题】:Should I use AlarmManager or Handler?我应该使用 AlarmManager 还是 Handler?
【发布时间】:2012-10-25 02:18:27
【问题描述】:

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

【问题讨论】:

    标签: android alarmmanager android-handler


    【解决方案1】:

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

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

    【讨论】:

    • 我查看了 Timer 文档,Timer 作为守护线程运行是什么意思?是服务吗?
    【解决方案2】:

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

    【讨论】:

    • 手机什么时候进入睡眠模式?我已经对我的应用进行了一段时间的 Beta 测试,设备进入待机状态从来都不是问题。
    • 我刚刚找到了更详细的类似答案:stackoverflow.com/a/5120225/538169
    【解决方案3】:

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

    报警管理器: AlarmManager 的优点是即使设备处于深度睡眠模式(CPU 关闭)它也能正常工作。当警报触发时,它会触发BroadcastReceiver 并在onReceive 中获取唤醒锁(如果您使用过WAKEUP 类型的警报,例如RTC_WAKEUPELAPSED_TIME_WAKEUP)。完成onReceive() 后,它会释放唤醒锁。

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

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

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

    【讨论】:

    • 谢谢。很高兴展示一个您如何获得自己的唤醒锁的示例。 stackoverflow 中有很多关于计时器或间隔做事的帖子,而我无法始终使用 AlarmManager、Handler、BackgroundServices 或 Sleeps 做到这一点:P 我唯一没有尝试过的是这里解释的 stackoverflow.com/a/11177974
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 2015-10-16
      • 2023-03-06
      相关资源
      最近更新 更多