Android 随设备移动时不退出休眠模式

Android does not exit doze mode when moving with device

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

我的印象是设备在移动时应该退出休眠模式。如本回答所述 。但是我在不同的设备上看到不一致的结果。我有三个测试设备。索尼 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 上,我让设备进入休眠模式。然而,在拿起它并与之一起移动时,它不会退出打瞌睡模式。它仅通过一些用户交互退出打瞌睡模式。在查看了其他答案和 android 的文档之后,我假设移动设备应该总是导致它从打瞌睡模式存在是正确的。如果是这种情况,这更有可能是硬件问题,还是 OEM 可以更改休眠模式的工作方式?

感谢您的帮助。

因此 android 需要能够检测运动才能退出休眠模式。摩托没有陀螺仪。这会阻止它检测运动并退出休眠模式。

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

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

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