了解低电耗模式
如果用户设备未插接电源、处于静止状态一段时间且屏幕关闭,设备会进入低电耗模式。 在低电耗模式下,系统会尝试通过限制应用对网络和 CPU 密集型服务的访问来节省电量。 这还可以阻止应用访问网络并推迟其作业、同步和标准闹铃。
系统会定期退出低电耗模式一会儿,好让应用完成其已推迟的 Activity。在此维护时段内,系统会运行所有待定同步、作业和闹铃并允许应用访问网络。
在每个维护时段结束后,系统会再次进入低电耗模式,暂停网络访问并推迟作业、同步和闹铃。 随着时间的推移,系统安排维护时段的次数越来越少,这有助于在设备未连接至充电器的情况下长期处于不活动状态时降低电池消耗。
一旦用户通过移动设备、打开屏幕或连接到充电器唤醒设备,系统就会立即退出低电耗模式,并且所有应用都将返回到正常 Activity。
低电耗模式限制
在低电耗模式下,您的应用会受到以下限制:
- 暂停访问网络。
- 系统将忽略 wake locks。
- 标准
AlarmManager
闹铃(包括setExact()
和setWindow()
)推迟到下一维护时段。 -
- 如果您需要设置在低电耗模式下触发的闹铃,请使用
setAndAllowWhileIdle()
或setExactAndAllowWhileIdle()
。 - 一般情况下,使用
setAlarmClock()
设置的闹铃将继续触发 — 但系统会在这些闹铃触发之前不久退出低电耗模式。
- 如果您需要设置在低电耗模式下触发的闹铃,请使用
- 系统不执行 Wi-Fi 扫描。
- 系统不允许运行同步适配器。
- 系统不允许运行
JobScheduler
。
将应用调整到低电耗模式
低电耗模式可能会对应用产生不同程度的影响,具体取决于应用提供的功能和使用的服务。 许多应用无需修改即可在低电耗模式周期中正常运行。 在某些情况下,您必须优化应用管理网络、闹铃、作业和同步的方式。 应用应该能够在每个维护时段内高效管理 Activity。
低电耗模式很容易影响 AlarmManager
闹铃和定时器管理的 Activity,因为当系统处于低电耗模式时,不会触发 Android 5.1(API 级别 22)或更低版本中的闹铃。
为了帮助您安排闹铃,Android 6.0(API 级别 23)引入了两种新的 AlarmManager
方法:setAndAllowWhileIdle()
和 setExactAndAllowWhileIdle()
。通过这些方法,您可以设置即使设备处于低电耗模式也会触发的闹铃。
注:对于每个应用,setAndAllowWhileIdle()
和 setExactAndAllowWhileIdle()
触发闹铃的时间间隔都不能低于 9 分钟。
低电耗模式对网络访问的限制也有可能影响您的应用,特别是当应用依赖于操作消息 (tickle) 或通知等实时消息时更是如此。 如果应用需要持久连接到网络来接收消息,您应尽量使用 Google Cloud Messaging (GCM)。
要确认应用在低电耗模式下按照预期运行,您可以使用 adb 命令强制系统进入和退出低电耗模式并观察应用的行为。如需了解详细信息,请参阅在低电耗模式和应用待机模式下进行测试。
了解应用待机模式
应用待机模式允许系统判定应用在用户未主动使用它时处于空闲状态。 当用户有一段时间未触摸应用时,系统便会作出此判定,以下条件均不适用:
- 用户显式启动应用。
- 应用当前有一个进程位于前台(表现为 Activity 或前台服务形式,或被另一 Activity 或前台服务占用)。
- 应用生成用户可在锁屏或通知托盘中看到的通知。
当用户将设备插入电源时,系统将从待机状态释放应用,从而让它们可以自由访问网络并执行任何待定作业和同步。 如果设备长时间处于空闲状态,系统将按每天大约一次的频率允许空闲应用访问网络。
对其他用例的支持
通过妥善管理网络连接、闹铃、作业和同步并使用 GCM 高优先级消息,几乎所有应用都应该能够支持低电耗模式。对于一小部分用例,这可能还不够。 对于此类用例,系统为部分免除低电耗模式和应用待机模式优化的应用提供了一份可配置的白名单。
在低电耗模式和应用待机模式期间,加入白名单的应用可以使用网络并保留部分 wake locks。 不过,正如其他应用一样,其他限制仍然适用于加入白名单的应用。 例如,加入白名单的应用的作业和同步将推迟(在 API 级别 23 及更低级别中),并且其常规 AlarmManager
闹铃不会触发。通过调用 isIgnoringBatteryOptimizations()
,应用可以检查自身当前是否位于豁免白名单中。
用户可以在 Settings > Battery > Battery Optimization 中手动配置该白名单。或者,系统会为应用提供请求用户将应用加入白名单的方式。
- 应用可以触发
ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
Intent,让用户直接进入 Battery Optimization,他们可以在其中添加应用。 - 具有
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
权限的应用可以触发系统对话框,让用户无需转到“设置”即可直接将应用添加到白名单。应用将通过触发ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
Intent 来触发该对话框。 - 用户可以根据需要手动从白名单中移除应用。
在请求用户将应用添加到白名单之前,请确保应用符合加入白名单的可接受用例。
在低电耗模式和应用待机模式下进行测试
为了确保用户获得极佳体验,您应在低电耗模式和应用待机模式下全面测试您的应用。
在低电耗模式下测试您的应用
您可按以下步骤测试低电耗模式:
-
使用 Android 6.0(API 级别 23)或更高版本的系统映像配置硬件设备或虚拟设备。
-
将设备连接到开发计算机并安装应用
-
运行应用并使其保持活动状态
-
关闭设备屏幕。(应用保持活动状态。)
-
通过运行以下命令强制系统在低电耗模式之间循环切换:
$ adb shell dumpsys battery unplug $ adb shell dumpsys deviceidle step
您可能需要多次运行第二个命令。不断地重复,直到设备变为空闲状态。
-
在重新激活设备后观察应用的行为。确保应用在设备退出低电耗模式时正常恢复。
在应用待机模式下测试您的应用
要在应用待机模式下测试您的应用,请执行以下操作:
-
使用 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>
-
观察唤醒后的应用行为。确保应用从待机模式中正常恢复。 特别地,您应检查应用的通知和后台作业是否按预期继续运行