如何区分设备进入打盹维护窗口和退出打盹
Posted
技术标签:
【中文标题】如何区分设备进入打盹维护窗口和退出打盹【英文标题】:How to differentiate between the device entering a Doze maintenance window and coming out of Doze 【发布时间】:2018-01-20 19:14:40 【问题描述】:我有一种方法可以定期运行以保持网络连接处于活动状态。在打盹模式下,我想禁用它定期运行并在维护窗口期间只运行一次。当设备退出 Doze 时,我希望再次定期调用该方法。我怎样才能做到这一点?
我注册了一个接收器,它监听PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED
广播,然后调用PowerManager.isDeviceIdleMode()
。但是,这两种情况都返回 false - 在维护窗口期间和设备退出打盹模式时。如何区分它们?
【问题讨论】:
【参考方案1】:我遇到了同样的问题,虽然我认为android必须通过在接收器中发送不同的状态来区分这一点,或者提供一个询问这种状态的函数,但我没有找到任何相关的东西。
请记住,ACTION_DEVICE_IDLE_MODE_CHANGED 会在 9-10 分钟后再次打瞌睡时再次触发。
解决办法是:
当前设备状态 -> “打盹空闲”
当您收到 ACTION_DEVICE_IDLE_MODE_CHANGED 并且 isDeviceIdleMode() 为 false 你的状态是“打瞌睡嫌疑” - 让您的保养窗口工作并在未来设置 15 分钟的警报。
关于下一次模式更改。
如果 ACTION_DEVICE_IDLE_MODE_CHANGED 在警报前触发并且 isDeviceIdleMode() 为真,那么,它是一个维护窗口。 “打瞌睡假”, (关掉闹钟)。
如果警报首先发出,这意味着它是“打瞌睡的真实确认” - 在闹钟中设置“打瞌睡”
打瞌睡的时间在文档中。一定要先检查一下。 (将来可能会发生变化,就像已经发生的那样 * 可能有一个常数可以得到那个值——我不知道)。
我认为这是一个 hack,而不是一个完整的解决方案。但它一直有效,直到将来在 android 上的任何扩展工作提供对 ACTION_DEVICE_IDLE_MODE_CHANGED 的另一个调用,并处于“打瞌睡”状态。
【讨论】:
以上是关于如何区分设备进入打盹维护窗口和退出打盹的主要内容,如果未能解决你的问题,请参考以下文章