为了延长设备的电池续航时间,Android 可以通过监控设备使用情况和唤醒状况来影响设备状态。如果用户未使用设备,平台会使设备进入休眠状态以便 activity 停止运行。
关于低电耗模式
如果用户长时间未使用设备,低电耗模式会延迟应用后台 CPU 和网络活动,从而延长电池续航时间。
处于低电耗模式的空闲设备会定期进入维护时段,在此期间,应用可以完成待进行的活动(同步、作业等)。然后,低电耗模式会使设备重新进入较长时间的休眠状态,接着进入下一个维护时段。在达到几个小时的休眠时间上限之前,平台会周而复始地重复低电耗模式休眠/维护的序列,且每一次都会延长闲置的时长。处于低电耗模式的设备始终可以感知到动作,且会在检测到动作时立即退出低电耗模式。
每当用户关闭设备屏幕时,即使仍处于移动状态,Android 7.0 及更高版本都会延长设备处于低电耗模式的时间,以触发一系列轻度优化,从而延长电池续航时间。
设备制造商通常将关键的系统服务设置为豁免应用,使其不进入低电耗模式。用户还可以通过“设置”菜单使特定的应用不进入低电耗模式。不过,设置为豁免应用也可能导致设备过度耗电。低电耗模式在 AOSP 中默认处于停用状态;如需详细了解如何启用低电耗模式,请参阅集成低电耗模式。
低电耗模式的要求
如需支持低电耗模式,设备必须具有云消息传递服务,如 Firebase Cloud Messaging (FCM)。外部触发事件(例如云消息传递)可以暂时唤醒应用执行任务,即使设备仍处于低电耗模式。
此外,如需全面支持低电耗模式,相应设备还必须具有大幅度动作检测器 (SMD);不过,Android 7.0 及更高版本中的轻度低电耗模式不要求具有 SMD。如果某台设备上启用了低电耗模式,且:
- 该设备具有 SMD,系统会进行全面的低电耗模式优化(包括轻度优化)。
- 该设备没有 SMD,系统仅会进行轻度低电耗模式优化。
低电耗模式生命周期
当平台检测到设备处于空闲状态时,便会使其进入低电耗模式,并在一个或多个满足退出条件的活动发生时使设备退出低电耗模式。
当设备具有以下特点时,平台会检测到其处于空闲状态:
- 设备是静止的(使用 SMD)。
- 设备屏幕已关闭一段时间。
当电池供电的设备连接到充电器时,不会进入低电耗模式。
低电耗模式期间
平台会尝试使系统处于休眠状态,定期进入维护窗口并恢复正常操作,然后使设备恢复休眠状态并延长重复周期。在休眠期间,设备会受到以下限制:
- 应用无法访问网络。
- 应用唤醒锁定被忽略。
- 闹钟被延迟。闹钟响铃以及使用
setAndAllowWhileIdle()
设置的闹钟(当设备处于低电耗模式时,限于每个应用每 15 分钟 1 次)除外。此豁免规则适用于必须显示活动提醒通知的应用(如日历)。 - 无法执行 WLAN 扫描。
SyncAdapter
同步和JobScheduler
作业被延迟,直到下一个维护时段才能恢复。- 接收短信和彩信的应用被暂时列入白名单,以便它们可以完成处理任务。
退出
当平台检测到以下情况时,会使设备退出低电耗模式:
- 用户与设备互动
- 设备移动操作
- 设备屏幕打开
- AlarmClock 即将响铃
通知不会使设备退出低电耗模式。
在屏幕关闭期间、设备处于空闲状态之前,Android 7.0 及更高版本通过启用轻度休眠模式来延长设备处于低电耗模式的时间。
图 1. 非静止和静止设备的低电耗模式。
操作 | Doze | 轻度低电耗模式 |
---|---|---|
触发器 | 屏幕关闭、电池供电、静止 | 屏幕关闭、电池供电(未插电) |
计时 | 随维护时段依次增加 | 随维护时段反复持续 N 分钟 |
限制 | 无法访问网络、唤醒锁定和 GPS/WLAN 扫描;闹钟和作业/同步被延迟 | 无法访问网络;作业/同步被延迟(维护窗口除外) |
行为 | 仅接收优先级较高的推送通知消息 | 接收所有实时消息(即时消息、致电等);优先级较高的推送通知消息可以暂时访问网络 |
退出 | 动作、屏幕开启或闹钟响铃 | 屏幕开启 |
与应用待机模式相集成
- 设备处于低电耗模式的时间不会计入应用待机模式。
- 当设备处于低电耗模式时,空闲应用一天至少可以执行一次正常操作。
集成低电耗模式
启用低电耗模式后,支持 SENSOR_TYPE_SIGNIFICANT_MOTION
的设备会执行全面的低电耗模式优化(包括轻度优化);没有 SMD 的设备仅执行轻度低电耗模式优化。Android 会自动选择适当的低电耗模式优化,无需供应商配置。
如需为设备启用低电耗模式,请执行以下操作:
- 确认设备已安装云消息传递服务。
- 在设备叠加层配置文件
overlay/frameworks/base/core/res/res/values/config.xml
中,将config_enableAutoPowerModes
设为true
:<bool name="config_enableAutoPowerModes">true</bool>
在 AOSP 中,此参数默认设为false
(低电耗模式处于停用状态)。
- 确认预加载的应用和服务满足以下要求:
- 确认必要的服务已被豁免,不会进入低电耗模式。
提示
- 如果可能,请使用 FCM 进行下游消息传递。
- 如果您的用户必须立即看到通知,请使用 FCM 高优先级消息。
- 在初始消息载荷内提供充足的信息(以避免不必要的后续网络访问)。
- 使用
setAndAllowWhileIdle()
和setExactAndAllowWhileIdle()
设置重要闹钟。
测试和优化应用
在低电耗模式下测试所有应用(尤其是预加载的应用)。如需了解详情,请参阅在低电耗模式和应用待机模式下进行测试。