https://developer.android.google.cn/training/monitoring-device-state/doze-standby
从 Android 6.0(API 级别 23)开始,Android 引入了两项省电功能,通过管理应用在设备未连接至电源时的行为方式,帮助用户延长电池寿命。当用户长时间未使用设备时,低电耗模式会延迟应用的后台 CPU 和网络活动,从而降低耗电量。应用待机模式会延迟用户近期未与之交互的应用的后台网络活动。
当设备处于低电耗模式时,应用对某些高耗电量资源的访问会延迟到维护期。电源管理限制中列出了具体的限制。
低电耗模式和应用待机模式管理在 Android 6.0 或更高版本上运行的所有应用的行为,无论它们是否专用于 API 级别 23。为确保用户获得最佳体验,请在低电耗模式和应用待机模式下测试您的应用,并对您的代码进行必要的调整。下面几部分提供了详细信息。
如果用户未插接设备的电源,在屏幕关闭的情况下,让设备在一段时间内保持不活动状态,那么设备就会进入低电耗模式。在低电耗模式下,系统会尝试通过限制应用访问占用大量网络和 CPU 资源的服务来节省电量。它还会阻止应用访问网络,并延迟其作业、同步和标准闹钟。
系统会定期退出低电耗模式一小段时间,让应用完成其延迟的活动。在此维护期内,系统会运行所有待处理的同步、作业和闹钟,并允许应用访问网络。
图 1. 低电耗模式提供了周期性维护期,让应用使用网络并处理待处理的活动。
在每个维护期结束时,系统会再次进入低电耗模式,暂停网络访问并推迟作业、同步和闹钟。随着时间的推移,系统安排维护期的次数越来越少,这有助于在设备未连接至充电器的情况下长期处于不活动状态时降低耗电量。
一旦用户通过移动设备、打开屏幕或连接至充电器唤醒设备,系统就会立即退出低电耗模式,并且所有应用都会恢复正常活动。
在低电耗模式下,您的应用会受到以下限制:
AlarmManager
闹钟(包括 setExact()
和 setWindow()
)推迟到下一个维护期。setAndAllowWhileIdle()
或 setExactAndAllowWhileIdle()
。setAlarmClock()
设置的闹钟将继续正常触发,系统会在这些闹钟触发之前不久退出低电耗模式。JobScheduler
。低电耗模式可能会对应用产生不同的影响,具体取决于应用提供的功能和使用的服务。许多应用无需修改即可在低电耗模式周期内正常运行。在某些情况下,您必须优化应用管理网络、闹钟、作业和同步的方式。应用应该能够在每个维护期内高效地管理活动。
低电耗模式尤其可能会影响 AlarmManager
闹钟和定时器管理的活动,因为当系统处于低电耗模式时,不会触发 Android 5.1(API 级别 22)或更低版本中的闹钟。
为了帮助安排闹钟,Android 6.0(API 级别 23)引入了两种新的 AlarmManager
方法:setAndAllowWhileIdle()
和 setExactAndAllowWhileIdle()
。通过这些方法,您可以设置即使设备处于低电耗模式也会触发的闹钟。
注意:setAndAllowWhileIdle()
及 setExactAndAllowWhileIdle()
为每个应用触发闹钟的频率都不能超过每 9 分钟一次。
应用待机模式允许系统判定应用在用户未主动使用它时是否处于闲置状态。当用户有一段时间未触摸应用时,系统便会作出此判定,以下条件均不适用:
注意:您只能将前台服务用于用户希望系统立即执行或不中断的任务。此类情况包括将照片上传到社交媒体,或者即使在音乐播放器应用不在前台运行时也能播放音乐。您不应该只是为了阻止系统判定您的应用处于闲置状态而启动前台服务。
当用户将设备插入电源时,系统会从待机状态释放应用,允许它们自由访问网络并执行任何待处理的作业和同步。如果设备长时间处于闲置状态,系统将允许闲置应用访问网络,频率大约每天一次。
通过妥善管理网络连接、闹钟、作业和同步以及使用高优先级 FCM 消息,几乎所有应用都应该能够支持低电耗模式。对于一小部分用例,这可能还不够。对于此类用例,系统提供了一个可配置的白名单,将部分免除低电耗模式和应用待机模式优化的应用列入其中。
在低电耗模式和应用待机模式期间,列入白名单的应用可以使用网络并保留部分唤醒锁定。不过,列入白名单的应用仍会受到其他限制,就像其他应用一样。例如,列入白名单的应用的作业和同步会延迟(在搭载 API 级别 23 及更低级别的设备上),并且其常规 AlarmManager
闹钟不会触发。应用可以调用 isIgnoringBatteryOptimizations()
来检查它当前是否在豁免白名单中。
用户可以依次转到设置 > 电池 > 电池优化来手动配置该白名单。另外,系统也提供了一些方法,让应用要求用户将其列入白名单。
ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
Intent,让用户直接转到电池优化,以便他们在其中添加该应用。REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
权限的应用可以触发一个系统对话框,让用户直接将该应用添加到白名单,而无需转到“设置”。此类应用将通过触发 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
Intent 来触发该对话框。在要求用户将您的应用添加到白名单之前,请确保该应用符合列入白名单的可接受用例。
注意:除非应用的核心功能受到不利影响,否则 Google Play 政策禁止应用请求直接免除 Android 6.0 及更高版本中的电源管理功能(低电耗模式和应用待机模式)的制约。
为确保用户获得良好的体验,您应在低电耗模式和应用待机模式下全面测试您的应用。
您可以按以下步骤在低电耗模式下测试您的应用:
$ adb shell dumpsys deviceidle force-idle
$ adb shell dumpsys deviceidle unforce
$ adb shell dumpsys battery reset
要在应用待机模式下测试您的应用,请执行以下操作:
$ adb shell dumpsys battery unplug $ adb shell am set-inactivetrue
$ adb shell am set-inactivefalse $ adb shell am get-inactive
下表重点介绍了请求将应用列入电池优化豁免白名单或应用目前在该白名单中的可接受用例。一般来说,除非低电耗模式或应用待机模式破坏了应用的核心功能,或者由于技术方面的原因而导致您的应用无法使用高优先级 FCM 消息,否则您的应用不应在白名单中。
如需了解详情,请参阅对其他用例的支持。
类型 | 用例 | 是否可以使用 FCM? | 是否可接受列入白名单? | 备注 |
---|---|---|---|---|
即时通讯、聊天或通话应用。 | 当设备处于低电耗模式或应用处于应用待机模式时,需要将实时消息传递给用户。 | 是,使用 FCM | 不可接受 | 应使用高优先级 FCM 消息唤醒应用并访问网络。 |
是,但不使用高优先级 FCM 消息。 | ||||
即时通讯、聊天或通话应用;企业 VOIP 应用。 | 否,不能使用 FCM,因为在技术上依赖其他消息传递服务,或者低电耗模式和应用待机模式破坏了应用的核心功能。 | 可接受 | ||
任务自动化应用 | 应用的核心功能是安排自动化操作,例如即时通讯、语音通话、新照片管理或位置操作。 | 如果适用。 | 可接受 | |
外围设备配套应用 | 应用的核心功能是保持与外围设备的持久性连接,以使外围设备能够接入互联网。 | 如果适用。 | 可接受 | |
应用只需定期连接到外围设备进行同步,或者只需连接到通过标准蓝牙配置文件连接的设备,如无线耳机。 | 如果适用。 | 不可接受 |
省电功能:低电耗模式和应用待机模式
低电耗模式会延迟应用的后台 CPU 和网络活动
- 暂停访问网络。
- 系统忽略唤醒锁定。
- 标准
AlarmManager
闹钟(包括setExact()
和setWindow()
)推迟到下一个维护期。
- 如果您需要设置在设备处于低电耗模式时触发的闹钟,请使用
setAndAllowWhileIdle()
或setExactAndAllowWhileIdle()
。- 使用
setAlarmClock()
设置的闹钟将继续正常触发,系统会在这些闹钟触发之前不久退出低电耗模式。- 系统不执行 WLAN 扫描。
- 系统不允许运行同步适配器。
- 系统不允许运行
JobScheduler
。
应用待机模式会延迟用户近期未与之交互的应用的后台网络活动。