Android 有两项省电功能,可通过以下方式延长电池续航时间: 管理应用在设备未连接电源时的行为:低电耗模式 以及应用待机模式低电耗模式会推迟 设备长时间未使用时应用的后台 CPU 和网络活动 。应用待机模式会将后台网络活动延迟到 近期无用户活动的应用。
当设备处于低电耗模式时,应用的使用某些高耗电量 资源就会被延迟到维护期。具体限制 列于 电源管理 限制。
低电耗模式和应用待机模式管理在 Android 6.0 上运行的所有应用的行为 或更高版本(无论它们是否明确以 API 级别 23 为目标平台)。 为了确保用户获得最佳体验,请在低电耗模式和应用模式下测试您的应用 待机模式,并对代码进行必要的调整。以下 部分提供了详细信息。
了解低电耗模式
如果用户将设备未接通电源并处于静止状态一段时间后, 屏幕关闭,设备会进入低电耗模式。在低电耗模式下,系统会尝试 通过限制应用的访问网络密集型和 CPU 密集型 服务。它还会阻止应用访问网络 作业、同步和标准闹钟。
系统会定期退出低电耗模式一会儿,让应用完成运行 延迟的活动在此维护窗口期间,系统会 运行所有待处理的同步、作业和闹钟,并允许应用程序访问网络。
![](https://developer.android.google.cn/static/images/training/doze.png?hl=hu)
维护窗口结束后,系统会再次进入低电耗模式, 暂停网络访问以及延迟作业、同步和闹钟。随着时间的推移, 减少系统安排维护窗口的频率,有助于减少耗电量 设备不充电时长时间处于不活动状态时的耗电量。
当用户通过移动设备、打开屏幕或 连接充电器后,系统会退出低电耗模式,且所有应用都将恢复正常 活动。
低电耗模式限制
在低电耗模式下,系统会对您的应用施加以下限制:
- 暂停网络访问。
- 忽略唤醒 锁定。
- 遵循标准
AlarmManager
闹钟,包括setExact()
和setWindow()
, 进入下一个维护窗口- 如果您需要设置在低电耗模式下触发的闹钟,请使用
setAndAllowWhileIdle()
或setExactAndAllowWhileIdle()
。 - 设置闹钟
setAlarmClock()
继续正常触发系统会提前一点时间退出低电耗模式 闹钟就会触发
- 如果您需要设置在低电耗模式下触发的闹钟,请使用
- 不执行 WLAN 扫描。
- 不允许同步适配器运行。
- 不允许
JobScheduler
运行。
低电耗模式核对清单
- 如果可能,请为下游使用 Firebase Cloud Messaging (FCM) 消息。
- 如果您的用户必须立即看到通知,请使用 FCM 高优先级消息。仅对产生的消息使用高优先级 。如需更多指导,请参阅 FCM 介绍 Android 消息优先级的文档。
- 在初始消息中提供充足的信息 负载,因此无需后续网络访问。
- 使用
setAndAllowWhileIdle()
和设置重要闹钟setExactAndAllowWhileIdle()
。 - 在低电耗模式下测试您的应用。
使应用适应低电耗模式
低电耗模式可能会对应用产生不同的影响,具体取决于应用提供的功能 及其使用的服务许多应用可在低电耗模式周期内正常运行 修改。在某些情况下,您必须按照 管理网络、闹钟、作业和同步。应用必须能够高效 管理每个维护窗口的活动。
为了帮助设置闹钟,您可以使用两个AlarmManager
方法:setAndAllowWhileIdle()
和
setExactAndAllowWhileIdle()
。通过这些方法,您可以设置闹钟
即使设备处于低电耗模式也会触发。
低电耗模式对网络访问的限制也有可能影响您的应用, 尤其是当应用依赖于操作消息或 通知。如果您的应用需要持久连接到网络 接收消息,如果遇到以下情况,请使用 Firebase 云消息传递 (FCM)
如需确认应用在低电耗模式下的行为符合预期,您可以使用
adb
命令强制系统进入和退出低电耗模式,以及
并观察应用的行为有关详情,请参阅
在低电耗模式和应用待机模式下进行测试。
了解应用待机模式
应用待机模式可让系统判定应用在用户未处于闲置状态时 。当用户未这样做时,系统便会做出此决定 轻触应用一段时间且符合以下任何条件 适用:
- 用户显式启动应用。
- 应用当前有一个进程位于前台,该进程要么作为 activity 或被其他 activity 或前台服务使用。
- 应用生成用户可在锁定屏幕上或 打开通知栏
当用户将设备插入电源时,系统会发布应用 以便自由访问网络并执行任何 待处理的作业和同步。如果设备长时间处于空闲状态, 系统大约每天允许闲置应用访问一次网络。
在设备处于空闲状态时使用 FCM 与您的应用交互
Firebase 云 消息 (FCM) 是一项云端到设备服务,让您能够支持实时 后端服务与 Android 设备上的应用之间的下游消息传递。FCM 可提供与云端的单一持久连接。需要满足以下所有要求的应用 实时消息传递功能可以共享这种连接。此共享连接 可显著优化电池消耗, 多个应用来分别维护各自的持久连接, 会让电池迅速耗尽因此,如果您的应用需要使用消息功能 与后端服务集成,但如果存在以下情况,强烈建议您使用 FCM 而无需保持你自己的持久网络连接
FCM 经过优化,适用于低电耗模式和应用待机模式。FCM 高优先级消息可让您唤醒应用以吸引用户。在低电耗模式或应用中 待机模式下,系统将传递消息并授予应用临时访问权限 网络服务和部分唤醒锁定,然后将设备或应用返回到 空闲状态对于对用户可见的具有时效性的通知,请考虑使用高 优先级消息,以便在低电耗模式下启用传送。高优先级消息 会导致通知。请参阅 FCM 指南。
对于不会收到通知的消息,例如保留应用内容 在后台保持最新状态或启动数据同步,请使用普通优先级 FCM 消息。如果设备未主动递送,系统会立即递送普通优先级消息 低电耗模式。如果设备处于低电耗模式,则会在周期内交付 低电耗模式维护窗口或在用户唤醒设备后立即启动。
作为一项常规最佳实践,如果您的应用需要下游消息传递,请使用 FCM。如果您的应用已在使用 FCM,请确保它使用的是高优先级消息 。
对其他用例的支持
几乎所有应用都能够通过管理网络连接来支持低电耗模式, 提醒、作业和同步,以及使用 FCM 消息。小范围使用 则这可能还不够对于此类情况,系统会提供一个 部分免于进入低电耗模式和应用待机模式的可配置应用列表 优化。
部分豁免的应用可以使用网络并保持部分唤醒
在低电耗模式和应用待机模式期间锁定。不过,其他限制仍然适用
就像对待其他应用一样。例如,应用的作业和同步
在 API 级别 23 及更低级别上会推迟,而其常规
AlarmManager
闹钟没有触发。应用可以检查自己是否
调用
isIgnoringBatteryOptimizations()
。
用户可以在设置 >电池 >电池优化。而对于 为应用提供请求用户豁免它们的方式:
- 大多数应用可以调用一个包含
ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
。 - 应用符合可接受的使用情形
而是可以调用包含
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
intent 操作可让用户直接将应用添加到豁免列表, 而无需转到系统设置
应用可以通过调用以下代码来检查自身当前是否在豁免列表中
isIgnoringBatteryOptimizations()
。
在低电耗模式和应用待机模式下进行测试
为确保用户获得良好的体验,请在低电耗模式下全面测试您的应用 以及应用待机模式
在低电耗模式下测试应用
您可以通过执行以下操作来测试低电耗模式:
- 使用 Android 6.0 (API) 配置硬件设备或虚拟设备 (级别 23)或更高版本的系统映像。
- 将设备连接到开发计算机并安装应用
- 运行应用并使其保持活动状态
- 运行以下命令强制系统进入空闲模式:
$ adb shell dumpsys deviceidle force-idle
- 准备就绪后,运行以下命令以退出空闲模式:
$ adb shell dumpsys deviceidle unforce
- 通过执行以下命令重新激活设备:
$ adb shell dumpsys battery reset
- 在重新激活设备后观察应用的行为。制造商 确保应用在设备退出低电耗模式时正常恢复。
在应用待机模式下测试您的应用
如需在应用待机模式下测试应用,请执行以下操作:
- 使用 Android 6.0 (API) 配置硬件设备或虚拟设备 (级别 23)或更高版本的系统映像。
- 将设备连接到开发计算机并安装应用
- 运行应用并使其保持活动状态
- 运行以下命令,强制应用进入应用待机模式:
$ adb shell dumpsys battery unplug $ adb shell am set-inactive <packageName> true
- 使用以下命令模拟唤醒应用:
$ adb shell am set-inactive <packageName> false $ adb shell am get-inactive <packageName>
- 在唤醒应用后观察它的行为。确保应用 从待机模式中正常恢复尤其要检查应用的 通知和后台作业按预期运行。
可接受的豁免使用情形
下表重点介绍了几个应用场景以及它们是否可接受
供应用使用 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
intent 操作。一般来说,您的应用不符合以下要求
例外情况,除非低电耗模式或应用待机模式破坏了应用的核心功能,或者
有一个技术原因导致您的应用无法使用高优先级 FCM
消息。
有关详情,请参阅对 其他用例。
类型 | 用例 | 是否可以使用 FCM? | 是否可接受豁免? | 备注 |
---|---|---|---|---|
即时通讯、聊天或通话应用。 | 需要在运行时将实时消息 设备处于低电耗模式或应用处于应用待机模式。 | 是,使用 FCM | 不可接受 | 使用高优先级 FCM 消息唤醒应用并进行访问 网络。 |
是,但未使用高优先级 FCM 消息。 | ||||
即时通讯、聊天或通话应用; 企业 VOIP 应用。 | 否,由于在技术上依赖于其他消息传递功能,因此无法使用 FCM 服务或低电耗模式和应用待机模式破坏了应用的核心功能。 | 可接受 | ||
“安全”应用。 | 旨在保障用户及其家人安全的应用。 | 如果适用。 | 可接受 | |
任务自动化应用。 | 应用的核心功能是安排自动化操作,例如针对免安装应用 消息、语音通话或新的照片管理功能。 | 如果适用。 | 可接受 | |
外围设备配套应用。 | 应用的核心功能是维持与应用的 用于提供外围设备的 访问互联网。 | 如果适用。 | 可接受 | |
应用只需定期连接到外围设备即可同步 或只需连接到设备(如无线耳机)、 通过标准蓝牙配置文件传输 | 如果适用。 | 不可接受 |