从Android 6.0(API 23)开始,Android 引入了两种省电功能(低电耗模式以及应用待机模式),帮助用户在设备未连接电源的时候延长电池的使用寿命。低电耗模式在设备长时间处于闲置状态下会推迟应用对CPU的使用以及对网络的使用以减少电池消耗。应用待机模式可推迟用户近期未与之的交互的应用使用网络。
低电耗模式以及应用待机模式会影响运行在Android 6.0以及更高版本的系统上的应用的行为,为了确保应用的功能不受影响,需在低电耗模式和应用待机模式下对其进行适配;
低电耗模式
如果用户设备未连接电源、处于静止状态一段时间且屏幕关闭,设备就会进入低电耗模式。在低电耗模式下,系统会尝试通过限制应用对网络的访问以及对CPU的使用来节省电量,还可以限制应用的一些同步处理以及对系统闹铃的使用。
系统会定期退出低电耗模式一会儿,好让应用完成其推迟的活动,在退出低电耗模式的这个时间内,系统会运行所有待处理的同步、作业并允许应用访问网络。
在每个维护时段结束后,系统会再次进入低电耗模式,暂停网络访问并推迟作业、同步和闹铃的使用。随着时间的推移,系统安排维护时段的次数越来越少,这有助于设备未连接电源充电的时候,在长期处于不活动状态的时候降低对电池的消耗。
一旦用户移动设备、打开屏幕或者连接到充电器的时候,系统就会退出低电耗模式,并且所有应用都会恢复正常。
低电耗模式限制
在低电耗模式下,您的应用会受到以下限制:
1、暂停访问网络。
2、系统将忽略wake locks。
3、标准AlarmManager闹铃(包括setExact()和setWindow())推迟到下一维护时段。如果您需要设置在低电耗模式下触发的闹铃,请使用setAndAllowWhileIdle()或setExactAndAllowWhileIdle()。一般情况下,使用setAlarmClock()设置的闹铃将继续触发 — 但系统会在这些闹铃触发之前不久退出低电耗模式。
4、系统不执行 Wi-Fi 扫描。
5、系统不允许运行同步适配器。
6、系统不允许运行JobScheduler。
应用待机模式
应用待机模式允许系统判定当用户未主动使用应用时,该应用是处于空闲状态的。当用户有一段时间未使用应用时,系统便会做出判定。以下条件系统均不会认为应用处于空闲状态:
1、用户显式启动应用。
2、应用当前有一个进程位于前台(表现为 Activity 或前台服务形式,或被另一 Activity 或前台服务占用)。
3、用户可在锁屏或通知栏中看到的通知。
4、系统应用。
当用户将设备插入电源时,系统将从待机状态释放应用,从而让它们可以自由访问网络并执行任何待定作业和同步。 如果设备长时间处于空闲状态,系统将按每天大约一次的频率允许空闲应用访问网络。
在设备空闲时使用 FCM 与您的应用交互
Firebase Cloud Messaging (FCM)是一项云端至设备的服务,允许您在后端服务与运行在Android 设备上的应用之间实时进行下游消息传递。FCM 提供了单一持久的云连接,所有需要实时传递消息的应用均可共享此连接。此共享连接使多个应用无需消耗电池即可维持自身单独的持久连接,避免快速耗尽电池,从而显著优化电池消耗。 因此,如果应用需要与后端服务进行消息传递集成,Google强烈建议尽量使用FCM,而非维持自身持久的网络连接。
FCM 经过优化,可将高优先级 GCM 消息用于低电耗模式和应用待机模式。FCM 高优先级消息允许您可靠地唤醒应用访问网络,即使用户设备处于低电耗模式或应用处于应用待机模式也不例外。 在低电耗模式或应用待机模式下,系统将传递消息并允许应用临时访问网络服务和部分唤醒锁,然后将设备或应用恢复到空闲状态。
高优先级 FCM 消息不会影响低电耗模式,也不会影响任何其他应用的状态。这意味着您的应用可以使用这些消息进行有效的通信,同时尽可能减少对整个系统和设备的电池影响。
作为一项常规最佳做法,如果您的应用需要下游消息传递,则应使用 FCM。如果您的服务器和客户端已经使用 FCM,请确保你的服务对关键消息使用高优先级消息,因为即使设备处于低电耗模式,这也会可靠地唤醒应用。
加入白名单的可接受用例
下表重点介绍了请求加入或目前位于电池优化豁免白名单中的可接受用例。 通常情况下,除非低电耗模式或应用待机模式破坏了应用的核心功能,或者由于技术方面的原因而导致您的应用无法使用 FCM 高优先级消息,否则您的应用不应出现在白名单上。
如需了解详细信息,请参阅对其他用例的支持。
对其他用例支持
通过妥善管理网络连接、闹铃、作业和同步并使用 GCM 高优先级消息,几乎所有应用都应该能够支持低电耗模式。但对于一小部分用例,可能不能够支持。 对于此类用例,系统为部分免除低电耗模式和应用待机模式优化的应用提供了一份可配置的白名单。
在进入低电耗模式和应用待机模式期间,加入白名单的应用可以使用网络并保留部分 wake locks。 不过,和其他应用一样,其他限制仍然适用于加入白名单的应用。 例如,加入白名单的应用的作业和同步将推迟(在 API 级别 23 及更低级别中),并且其常规AlarmManager闹铃不会触发。通过调用isIgnoringBatteryOptimizations(),应用可以检查自身当前是否位于豁免白名单中。
用户可以在Settings > Battery > Battery Optimization中手动配置该白名单。或者,系统会为应用提供请求将应用加入白名单的方式。
1、应用可以触发ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGSIntent,让用户直接进入Battery Optimization,他们可以在其中添加应用。
2、具有REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限的应用可以触发系统对话框,让用户无需转到“设置”即可直接将应用添加到白名单。应用将通过触发ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONSIntent 来触发该对话框。
3、用户可以根据需要手动从白名单中移除应用。
在请求将应用添加到白名单之前,请确保应用符合加入白名单的可接受用例。