调度重复事件 - Handler.PostDelayed和Doze

时间:2017-08-01 23:28:19

标签: android timer alarmmanager handler android-doze

上下文

我正在使用适用于Android的屏幕过滤器应用(例如f.lux)。我正在使用该功能,以便在太阳落山时逐渐淡入滤镜。屏幕关闭时状态无关紧要,但是当屏幕打开时,淡入淡出进度正确(或立即更新)非常重要。

技术要求

  • 我想以半定期间隔发射一系列意图。
  • 当屏幕关闭时,可以忽略/丢弃它们,除外:
    • 当屏幕亮起时,必须立即触发最近的意图。
  • 我不想不必要地耗尽电池。

明显的解决方案以及他们为什么不工作

  

您的闹钟首次触发不会在请求的时间之前,但在此之后几乎整整一段时间内可能不会发生。

我认为这意味着第一个触发器必然在第一个间隔内发生,这意味着设备将被唤醒,导致不必要的电池消耗。

  • 我可以使用AlarmManager.set来安排第一次闹钟。当它关闭时,我可以更新屏幕,然后安排下一个警报。这可以工作,但会在每个闹钟上唤醒旧设备(没有打盹),而不是等到屏幕打开。它还使用AlarmManger作为计时器,文档明确建议不要使用:
  

对于计时操作(滴答,超时等),使用Handler会更容易,也更有效。

好的,那么,

  • 我可以设置一个警报来启动Handler,这会定期更新UI。但等等:这取决于postDelayed,其中说(强调我的):
  

深度睡眠所花费的时间会增加 额外 延迟执行。

我认为这意味着,当设备从睡眠状态唤醒时,下一次更新可能不会在整个时间间隔内发生。我看对了吗?在下次更新之前强制用户等待一两分钟是一个交易破坏者。

CountDownTimerValueAnimator都在他们的实现中使用此方法,因此如果我对Handler的解释是正确的,那么它们都会出局。

我可以使用基于处理程序的方法,并在屏幕关闭时接收事件,此时我取消现有动画,然后开始新动画。这看起来是最好的解决方案,但似乎应该有一种更简单的方法。

结论

关于这个主题还有很多其他的SO问题。每个人和他们的母亲都建议使用处理程序,但除了上面的引用之外,绝对没有关于它在设备进入睡眠状态时的行为方式的信息。 (显然)其他人没有遇到过这个问题真的很奇怪 - 我做的事情是不寻常的,还是遗漏了一些基本的东西?

任何人都可以提供有关Handler.postDelayed在设备进入睡眠状态时的真实行为的见解,并建议我应该在此特定实例中做些什么?

0 个答案:

没有答案