我正在使用适用于Android的屏幕过滤器应用(例如f.lux)。我正在使用该功能,以便在太阳落山时逐渐淡入滤镜。屏幕关闭时状态无关紧要,但是当屏幕打开时,淡入淡出进度正确(或立即更新)非常重要。
AlarmManager.setInexactRepeating
,这可能是最节能的警报,除了:您的闹钟首次触发不会在请求的时间之前,但在此之后几乎整整一段时间内可能不会发生。
我认为这意味着第一个触发器必然在第一个间隔内发生,这意味着设备将被唤醒,导致不必要的电池消耗。
AlarmManager.set
来安排第一次闹钟。当它关闭时,我可以更新屏幕,然后安排下一个警报。这可以工作,但会在每个闹钟上唤醒旧设备(没有打盹),而不是等到屏幕打开。它还使用AlarmManger作为计时器,文档明确建议不要使用:对于计时操作(滴答,超时等),使用Handler会更容易,也更有效。
好的,那么,
Handler
,这会定期更新UI。但等等:这取决于postDelayed
,其中说(强调我的):深度睡眠所花费的时间会增加 额外 延迟执行。
我认为这意味着,当设备从睡眠状态唤醒时,下一次更新可能不会在整个时间间隔内发生。我看对了吗?在下次更新之前强制用户等待一两分钟是一个交易破坏者。
CountDownTimer和ValueAnimator都在他们的实现中使用此方法,因此如果我对Handler的解释是正确的,那么它们都会出局。
我可以使用基于处理程序的方法,并在屏幕关闭时接收事件,此时我取消现有动画,然后开始新动画。这看起来是最好的解决方案,但似乎应该有一种更简单的方法。
关于这个主题还有很多其他的SO问题。每个人和他们的母亲都建议使用处理程序,但除了上面的引用之外,绝对没有关于它在设备进入睡眠状态时的行为方式的信息。 (显然)其他人没有遇到过这个问题真的很奇怪 - 我做的事情是不寻常的,还是遗漏了一些基本的东西?
任何人都可以提供有关Handler.postDelayed
在设备进入睡眠状态时的真实行为的见解,并建议我应该在此特定实例中做些什么?