5

语境

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

技术要求

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

明显的解决方案以及为什么它们不起作用

您的警报的第一次触发不会在请求的时间之前,但它可能不会在该时间之后的几乎整个间隔内发生。

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

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

对于计时操作(滴答声、超时等),使用 Handler 更容易、更高效。

可以,然后呢,

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

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

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

CountDownTimerValueAnimator在它们的实现中都使用了这个方法,所以如果我对 Handler 的解释是正确的,它们都出局了。

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

结论

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

任何人都可以提供有关Handler.postDelayed设备进入睡眠状态时的实际行为的见解,并推荐我在这种特定情况下应该做什么?

4

0 回答 0