如何区分设备进入打盹维护窗口和退出打盹

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 的另一个调用,并处于“打瞌睡”状态。

【讨论】:

以上是关于如何区分设备进入打盹维护窗口和退出打盹的主要内容,如果未能解决你的问题,请参考以下文章

与设备一起移动时,Android 不会退出打盹模式

打盹模式 - 前台服务是不是继续运行?

打盹模式如何影响后台/前台服务,有/没有部分/全部唤醒锁?

打盹模式处理

如何以编程方式关闭棉花糖设备中特定应用程序的打盹模式

如何在打盹模式下移动设备(Android Preview M / Marshmallow)?