Android 7/Nougat 的一个变化是 Doze 现在“更具侵略性”。在 Android 6/Marshmallow 中,当屏幕关闭、设备依靠电池运行且处于静止状态时,打盹模式会启动。
(这在Optimizing for Doze and App Standby中有记录)
现在在 Android 7 中,条件只是屏幕关闭并依靠电池运行。
(这在Android 7.0 Behavior Changes中有记录)
如果应用程序破坏了其核心功能,则可以将其列入白名单以免除限制。在您的情况下,他们这样做是因为 GPS 跟踪器需要实时记录坐标。
有Acceptable Use Cases for Whitelisting的列表
这包括:
任务自动化应用程序 | App的核心功能是自动调度
操作,例如即时消息、语音通话、新照片
管理,或位置操作。
用户可以在设备设置中自行手动将应用列入白名单,也可以由应用请求加入白名单并由用户批准或拒绝。
Support for Other Use Cases 对此进行了介绍
引用:
应用可以触发 ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS Intent
将用户直接带到电池优化,在那里他们可以
添加应用。
拥有 REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 权限的应用可以
触发系统对话框,让用户将应用添加到白名单
直接,不用去设置。该应用程序触发
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 意图触发
对话框。
用户可以根据需要手动将应用从白名单中移除。
最后一点当然很重要,但幸运的是可以通过编程方式检查白名单状态:
应用可以通过以下方式检查其当前是否在豁免白名单中
调用 isIgnoringBatteryOptimizations()。
因此,处理打瞌睡模式至少是一回事。
另一个问题是保持服务正常运行。但是服务被系统杀死可能会导致更多的随机时间间隔。当然还有using START_STICKY或running as a foreground service这样的经典。