Android 具有两项省电功能,可通过管理应用在设备未连接至电源时的行为方式,帮助用户延长电池续航时间:休眠模式和应用待机模式。当用户长时间未使用设备时,低电耗模式会延迟应用的后台 CPU 和网络活动,从而降低耗电量。应用待机模式会延迟近期无用户活动的应用的后台网络活动。
当设备处于低电耗模式时,应用对某些高耗电量资源的访问会延迟到维护期。电源管理限制中列出了具体的限制。
低电耗模式和应用待机模式管理在 Android 6.0 或更高版本上运行的所有应用的行为,无论它们是否专用于 API 级别 23。为确保用户获得最佳体验,请在低电耗模式和应用待机模式下测试您的应用,并对您的代码进行必要的调整。以下部分提供了详细信息。
了解低电耗模式
如果用户未接通电源、在屏幕关闭的情况下使设备在一段时间内保持不活动状态,设备会进入低电耗模式。在低电耗模式下,系统会尝试通过限制应用对网络和 CPU 密集型服务的访问来节省电量。它还会阻止应用访问网络,并延迟其作业、同步和标准闹钟。
系统会定期退出低电耗模式一会儿,以便让应用完成其已推迟的 activity。在此维护期内,系统会运行所有待处理的同步、作业和闹钟,并允许应用访问网络。
维护期结束后,系统会再次进入低电耗模式,暂停网络访问并推迟作业、同步和闹钟。随着时间的推移,系统安排维护窗口的频率会降低,这有助于在设备未充电且处于非活动状态时间较长的情况下减少电池消耗。
当用户通过移动设备、打开屏幕或连接充电器唤醒设备时,系统会退出低电耗模式,并且所有应用都将恢复正常活动。
低电耗模式限制
在低电耗模式下,系统会对您的应用施加以下限制:
- 暂停网络访问。
- 忽略唤醒锁定。
- 将标准
AlarmManager
闹钟(包括setExact()
和setWindow()
)推迟到下一个维护期。- 如果您需要设置在低电耗模式下触发的闹钟,请使用
setAndAllowWhileIdle()
或setExactAndAllowWhileIdle()
。 - 使用
setAlarmClock()
设置的闹钟将继续正常触发。系统会在这些闹钟触发之前不久退出低电耗模式。
- 如果您需要设置在低电耗模式下触发的闹钟,请使用
- 不执行 Wi-Fi 扫描。
- 不允许运行同步适配器。
- 不允许
JobScheduler
运行。
低电耗模式核对清单
- 如果可能,请使用 Firebase Cloud Messaging (FCM) 进行下游消息传递。
- 如果您的用户必须立即看到通知,请使用 FCM 高优先级消息。仅针对导致通知的消息使用高优先级。如需更多指导,请参阅 FCM 关于 Android 消息优先级的文档。
- 在初始消息载荷内提供足够的信息,这样随后就无需访问网络。
- 使用
setAndAllowWhileIdle()
和setExactAndAllowWhileIdle()
设置重要闹钟。 - 在低电耗模式下测试您的应用。
使应用适应低电耗模式
低电耗模式可能会对应用产生不同的影响,具体取决于应用提供的功能和使用的服务。许多应用无需修改即可在休眠周期内正常运行。在某些情况下,您必须优化应用管理网络、闹钟、作业和同步的方式。应用必须能够在每个维护期内高效地管理活动。
为帮助安排闹钟,您可以使用两种 AlarmManager
方法:setAndAllowWhileIdle()
和 setExactAndAllowWhileIdle()
。通过这些方法,您可以设置即使设备处于低电耗模式也会触发的闹钟。
低电耗模式对网络访问的限制也有可能影响您的应用,尤其是当应用依赖于操作消息或通知等实时消息时。如果应用需要与网络建立持久性连接来接收消息,请尽可能使用 Firebase Cloud Messaging (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
的 intent。 - 满足可接受的使用情形的应用可以改为调用包含
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
intent 操作的 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。 | 可接受 | ||
“安全”应用。 | 旨在保障用户及其家人安全的应用。 | 如果适用。 | 可接受 | |
任务自动化应用。 | 应用的核心功能是安排自动化操作,例如即时通讯、语音通话或新照片管理。 | 如果适用。 | 可接受 | |
外围设备配套应用。 | 应用的核心功能是保持与外围设备的持久连接,以便为外围设备提供互联网访问权限。 | 如果适用。 | 可接受 | |
应用只需要定期连接到外围设备进行同步,或者只需要连接到通过标准蓝牙配置文件连接的设备,例如无线耳机。 | 如果适用。 | 不可接受 |