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

Posted

技术标签:

【中文标题】与设备一起移动时,Android 不会退出打盹模式【英文标题】:Android does not exit doze mode when moving with device 【发布时间】:2019-01-06 15:06:03 【问题描述】:

所以有些背景,我正在开发一个位置跟踪应用程序。我正在运行一项使用融合位置提供程序获取 gps 更新的服务。当应用程序关闭或设备被锁定时,我的服务将移至前台。它还使用部分唤醒锁并被列入白名单。

我的印象是设备在移动时应该退出打盹模式。如本答案here 所述。但是,我在不同的设备上看到不一致的结果。我有三个测试设备。一个索尼 experia,一个 moto e4 plus 和一个 nexus 5x。该应用程序在索尼和 nexus 上运行良好。我让它闲置,打盹模式启动,然后当我移动设备时,它退出打盹模式并重新开始 gps 更新。这很好,因为当设备静止时我不需要 gps 更新,这只会浪费电池寿命。为清楚起见,每个设备的不同 android 版本是:

Sony Xperia: 7.0
Moto E4 plus: 7.1.1
Nexus 5X: 8.0

问题出在 moto 上,我让设备进入打盹模式。然而,在拿起它并与它一起移动时,它不会退出打盹模式。它仅通过一些用户交互退出打盹模式。在查看其他答案和 androids 文档后,我假设移动设备应该始终导致它从打盹模式存在,这是正确的。如果是这种情况,这更有可能是硬件问题,还是 OEM 可以更改打盹模式的工作方式?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

所以 android 需要能够检测运动才能离开打盹模式。摩托没有陀螺仪。这会阻止它检测运动并退出打盹模式。

【讨论】:

【参考方案2】:

要使此功能正常工作,制造商应该已实施“重要运动传感器”。您可以通过询问此传感器是否存在来检查此传感器是否可用:“android.sensor.significant_motion”。

SensorManager mSensorManager = (SensorManager) mContext.getSystemService(Service.SENSOR_SERVICE);
boolean isSensorPresent = mSensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION) != null;

除此之外,还有一些制造商使用自己的电源管理系统绕过打盹模式规则。例如,华为和小米生产的某些手机就是这种情况。 在这些情况下,可以停止制造商电源管理系统以暂停您的应用程序。但必须由用户手动完成。

【讨论】:

以上是关于与设备一起移动时,Android 不会退出打盹模式的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Android 6.0 处于打盹模式时如何让闹钟管理器工作?

什么是打盹模式计时?

如何在 Android 上测试打盹模式?

当应用程序处于打盹模式时,警报管理器触发的 Android 通知未触发