省电模式是系统里的一个开关,开启后会降低设备的性能,限制后台应用的活动和数据同步(如邮件接收),并限制GPS访问。
用户可以主动开启省电模式,也可以设置电量少于一定程度是自动开启省电模式。
一般 Android 设备厂商的定制系统,还会提供超级省电模式,只允许必要的 app 运行,并断开数据连接。
设备连接到充电器的时候,一般情况下,系统会自动退出省电模式(定制系统可能行为会不一样)。
Android 6.0 开始引入的省电机制。英文名称 Doze mode(Doze 即打盹),又称打盹模式。
如果用户设备未连接电源、处于静止状态一段时间且屏幕关闭,设备就会进入低电耗模式。在低电耗模式下,系统会尝试通过限制应用对网络的访问以及对CPU的使用来节省电量,还可以限制应用的一些同步处理以及对系统闹钟的使用。
在每个维护时段结束后,系统会再次进入低电耗模式。随着时间的推移,系统安排维护时段的次数越来越少,这有助于降低对电池的消耗。
一旦用户移动设备、打开屏幕或者连接到充电器的时候,系统就会自动退出低电耗模式,所有应用都会恢复正常。
在低电耗模式下,您的应用会受到以下限制:
1、暂停访问网络。
2、系统将忽略 wake locks(唤醒锁)。
3、AlarmManager 闹钟推迟到下一维护时段。
4、系统不执行 Wi-Fi 扫描。
5、系统不允许运行数据同步。
6、系统不允许运行 JobScheduler。
Android 6.0+ 里的 设置 - 应用 - 特殊访问权限 - 电池优化 功能,可以配置 Doze 模式白名单。一般用户安装的应用都默认启用了电池优化,如果要使某个应用在系统处于低电耗模式时也能正常访问网络,可以设置“不允许”电池优化。
一般国内安卓手机系统都默认将QQ和微信设为“不允许”电池优化,主要是因为QQ和微信没有使用任何系统级推送通道,但是凭着他们庞大的用户量,国内手机厂商不敢“电池优化”它们(限制它们的活动),否则,被普通用户认为“这手机真垃圾,微信消息都收不到”。
浅度打盹
屏幕关闭
电池未处于充电模式
深度打盹
屏幕关闭
电池未处于充电模式
设备静止约30分钟
# 进入未连接充电的模式
adb shell dumpsys battery unplug
# 强行进入Doze模式(deep表示深度打盹)
adb shell dumpsys deviceidle step [light|deep]
# 退出Doze模式,让手机恢复正常需要复位充电模式
adb shell dumpsys battery reset
也是一种系统机制。当用户有一段时间未主动使用应用时,系统判定该应用处于空闲状态。以下情况除外:
1、用户显式启动应用。
2、应用当前有一个进程位于前台(表现为 Activity 或前台服务形式,或被另一 Activity 或前台服务占用)。
3、用户可在锁屏或通知栏中看到的通知。
4、系统应用。
当用户将设备插入电源时,系统将退出待机状态,从而让它们可以自由访问网络并执行任何待定作业和同步。 如果设备长时间处于空闲状态,系统将按每天大约一次的频率允许空闲应用访问网络。
具有前台服务(Foreground Service,通过startForeground启动的service)的应用,将不会进入待机模式。
可以看出,低电耗模式是系统级别的,应用待机模式是应用级别的。
wakelock 是一种锁的机制,只要有应用拿着这个锁,CPU就无法进入休眠状态,一直处于工作状态。比如,手机屏幕在屏幕关闭的时候,有些应用依然可以唤醒屏幕提示用户消息,这里就是用到了wakelock锁机制,虽然手机屏幕关闭了,但是这些应用依然在运行着。
app 可以向系统服务 PowerManagerService 申请唤醒锁
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag");
上面的低电耗模式中提到,低电耗模式下,系统会忽略电池优化了的应用持有的唤醒锁。也就是说,被电池优化了的应用,持有唤醒锁也是没用的,系统照样可以限制其活动。
如果要使一个 app 可以后台运行并能正常联网,一般需要做:
1、用户主动允许 app 在后台运行
这一般是安卓厂商定制系统提供的功能。默认情况,大部分系统在应用切到后台一段时间后,会被杀进程。
主要是因为国情,谷歌的 GCM/GCM 推送在国内无法使用,造成以前安卓后台运行应用太多,手机卡顿的情形。
如今的国内安卓定制系统都加入了 允许后台运行 的开关。
2、用户主动关闭 省电模式,或者接入充电器充电
省电模式下,应用切到后台一段时间后,会限制后台应用的活动和网络访问。
3、用户主动将应用加入电池优化白名单
防止系统休眠进入低电耗模式时,限制应用的活动和网络访问。
4、启动一个前台服务防止应用进入待机模式
一般前台服务(foreground service)会在状态栏显示一个通知,最典型的应用就是音乐播放器。
5、应用持有唤醒锁
阻止系统休眠。QQ 就是这么干的,手机经常警告 QQ 高耗电(垃圾软件,又不能不用!)
6、允许应用在后台使用数据流量
可以通过编程的方式,引导用户跳转到系统的“流量节省程序”设置中,允许 app 在后台使用数据流量。
否则,应用在后台或手机锁屏时,要么被杀进程,要么被限制活动、限制网络访问。这时,就只能通过系统级推送才能将新消息通知到用户了。