从 Android 6.0(API 级别 23)开始,Android 引入了两个省电功能,可通过管理应用在设备未连接至电源时的行为方式为用户延长电池寿命。 低电耗(Doze)模式通过在设备长时间处于闲置状态时推迟应用的后台 CPU 和网络 Activity 来减少电池消耗。 应用待机(App Standby)模式可推迟用户近期未与之交互的应用的后台网络 Activity。

低电耗模式(Doze模式)

如果用户设备未插接电源、处于静止状态一段时间且屏幕关闭,设备会进入低电耗模式。 在低电耗模式下,系统会尝试通过限制应用对网络和 CPU 密集型服务的访问来节省电量。 这还可以阻止应用访问网络并推迟其作业、同步和标准闹铃。

系统会定期退出低电耗模式一会儿,好让应用完成其已推迟的 Activity。在此维护时段内,系统会运行所有待定同步、作业和闹铃并允许应用访问网络。

而 Android 7.0 则通过在设备未插接电源且屏幕关闭状态下、但不一定要处于静止状态(例如用户外出时把手持式设备装在口袋里)时应用部分 CPU 和网络限制,进一步增强了低电耗模式。

图 1. 低电耗模式如何应用第一级系统活动限制以延长电池寿命的图示。

7.0进入Doze模式分两个阶段: 对App行为的限制分为light idle(浅度doze)和deep idle(深度doze).当设备处于非充电状态且屏幕已关闭一定时间后,设备会进入低电耗模式并应用第一部分限制(light idle):关闭应用网络访问、推迟作业和同步。如果进入低电耗模式后设备处于静止状态达到一定时间,系统则会对 PowerManager.WakeLock、AlarmManager 闹铃、GPS 和 WLAN 扫描应用余下的低电耗模式限制(deep idle)。无论是应用部分还是全部低电耗模式限制,系统都会唤醒设备以提供简短的维护时间窗口,在此窗口期间,应用程序可以访问网络并执行任何被推迟的作业/同步。

light idle:(第一级限制,图2中 第一个Doze阶段)进入条件:   非充电状态且屏幕已关闭一定时间后限制:       关闭应用网络访问、推迟作业和同步deep idle:(第二级限制,图2中 第二个Doze阶段)进入条件:   进入light idle模式后设备处于静止状态达到一定时间限制:       PowerManager.WakeLock、AlarmManager 闹铃、GPS 和 WLAN 扫描

在每个维护时段结束后,系统会再次进入低电耗模式,暂停网络访问并推迟作业、同步和闹铃。 随着时间的推移,系统安排维护时段的次数越来越少,这有助于在设备未连接至充电器的情况下长期处于不活动状态时降低电池消耗。

图 2. 低电耗模式如何在设备处于静止状态达到一定时间后应用第二级系统活动限制的图示。

图中,横轴表示随着时间的推移,橙色表示设备处于唤醒运行状态,绿色表示低电耗(Doze)休眠状态;当设备处于on battery(利用电池供电,也就是未插接电源),screen off(关闭屏幕),stationary(静止状态,7.0以后非静止状态亦可)保持以上条件一段时间之后,设备就会进入Doze模式.

maintenance window (低电耗(Doze)模式提供了定期维护时段,可供应用使用网络并处理待定Activity),Doze模式下会定期的进入maintenance window,但进入的间隔越来越长

一旦用户通过移动设备、打开屏幕或连接到充电器唤醒设备,系统就会立即退出低电耗模式,并且所有应用都将返回到正常 Activity。

低电耗模式限制

在低电耗模式下,您的应用会受到以下限制:

  • 暂停访问网络。
  • 系统将忽略 wake locks。
  • 标准 AlarmManager 闹铃(包括 setExact() 和 setWindow())推迟到下一维护时段。
  • 如果您需要设置在低电耗模式下触发的闹铃,请使用 setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle()。
  • 一般情况下,使用 setAlarmClock() 设置的闹铃将继续触发 — 但系统会在这些闹铃触发之前不久退出低电耗模式。
  • 系统不执行 Wi-Fi 扫描。
  • 系统不允许运行同步适配器。
  • 系统不允许运行 JobScheduler。

应用待机模式(App Standby)

应用待机模式: 允许系统判定 应用在用户未主动使用它时,将应用置为空闲状态;通俗的说是指用户在一段时间内没有使用某个app,系统就会让这个app处于空闲状态,空闲状态会限制app访问网络,推迟app的作业和同步任务

当用户有一段时间未触摸应用,且除以下条件外,都将被标记为空闲状态

  • 用户显式启动应用(直接点击app启动)
  • 应用当前有一个进程位于前台(表现为 Activity 或前台服务形式,或被另一 Activity 或前台服务占用)
  • 应用生成用户可在锁屏或通知托盘中看到的通知。

当用户将设备插入电源时,系统将从待机状态释放应用,从而让它们可以自由访问网络并执行任何待定作业和同步。 如果设备长时间处于空闲状态,系统将按每天大约一次的频率允许空闲应用访问网络。

低电耗模式和应用待机模式下进行测试

为了确保用户获得极佳体验,您应在低电耗模式和应用待机模式下全面测试您的应用

低电耗模式

您可按以下步骤测试低电耗模式:

  • 1.使用 Android 6.0(API 级别 23)或更高版本的系统映像配置硬件设备或虚拟设备。
  • 2.将设备连接到开发计算机并安装应用
  • 3.运行应用并使其保持活动状态
  • 4.关闭设备屏幕。(应用保持活动状态。)
  • 5.通过运行以下命令强制系统在低电耗模式之间循环切换:
$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle step

您可能需要多次运行第二个命令。不断地重复,直到设备变为空闲状态。

  • 6.在重新激活设备后观察应用的行为。确保应用在设备退出低电耗模式时正常恢复。

应用待机模式

要在应用待机模式下测试您的应用,请执行以下操作:

  • 1.使用 Android 6.0(API 级别 23)或更高版本的系统映像配置硬件设备或虚拟设备。
  • 2.将设备连接到开发计算机并安装应用
  • 3.运行应用并使其保持活动状态
  • 4.通过运行以下命令强制应用进入应用待机模式:
$ adb shell dumpsys battery unplug
$ adb shell am set-inactive <packageName> true
  • 5.使用以下命令模拟唤醒应用:
$ adb shell am set-inactive <packageName> false
$ adb shell am get-inactive <packageName>
  • 6.观察唤醒后的应用行为。确保应用从待机模式中正常恢复。特别地,您应检查应用的通知和后台作业是否按预期继续运行

亲测MIUI 9.5执行 adb shell am set-inactive com.tencent.mobileqq true 结果始终为: Idle=false 而测试其他包名则没有异样,也就是小米针对QQ这种用户量大的即时通讯软件做了针对性处理

Doze和App Standby白名单

通过妥善管理网络连接、闹铃、作业和同步并使用 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 来触发该对话框。
    boolean hasIgnored = powerManager.isIgnoringBatteryOptimizations(getPackageName());if(!hasIgnored) {Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);intent.setData(Uri.parse("package:"+getPackageName()));startActivity(intent);}

如何将非系统app预置到Doze的白名单中

  • 用户可以根据需要手动从白名单中移除应用。

在请求用户将应用添加到白名单之前,请确保应用符合加入白名单的可接受用例。

注:除非应用的核心功能受到不利影响,否则 Google Play 政策禁止应用请求直接豁免 Android 6.0+ 中的电源管理功能(低电耗模式和应用待机模式)

DeviceIdleController

    Android系统默认是关闭Doze模式的,开启Doze模式方式如下:
    frameworks/base/core/res/res/values/config.xml   <bool name="config_enableAutoPowerModes">true</bool>

Doze模式的实现主要在/frameworks/base/services/core/java/com/android/server/DeviceIdleController.java

以上主要内容参考自Google官方文档 .

android 7.0低电耗Doze模式相关推荐

  1. Android 功耗优化(4)---android 7.0低电耗Doze模式

    android 7.0低电耗Doze模式 从 Android 6.0(API 级别 23)开始,Android 引入了两个省电功能,可通过管理应用在设备未连接至电源时的行为方式为用户延长电池寿命. 低 ...

  2. Android 6.0 低电耗模式 和 待机(休眠)模式

    因为公司项目在做VOIP网络电话功能, 所以就涉及到后台常驻服务: 驻留一个服务, 等待有网络电话打进来. 探索了多种后台常驻技术手段... 在使用了现阶段能用的后台常驻服务手段后(用户感知比较强烈那 ...

  3. 安卓 省电模式、低电耗(Doze)模式、应用待机(standby)模式、唤醒锁

    省电模式 省电模式是系统里的一个开关,开启后会降低设备的性能,限制后台应用的活动和数据同步(如邮件接收),并限制GPS访问. 用户可以主动开启省电模式,也可以设置电量少于一定程度是自动开启省电模式. ...

  4. 【Android 低电耗/Doze原理---设备运动状态和位置对Doze模式的影响】

    Android 低电耗/Doze原理---设备运动状态和位置对Doze模式的影响 基础知识 Deep Idle的状态机 STATE_IDLE_PENDING----监听运动状态变化 STATE_SEN ...

  5. 【Android 电量优化】电量优化特性 ( Doze 低电耗模式 | Standby 应用待机模式 | 白名单设置 | 白名单添加系统设置界面 | 指定应用的白名单添加界面 | 测试应用 )

    文章目录 一.Doze 低耗电模式简介 二.Standby 应用待机模式简介 三.Doze 和 Standby 模式测试 四.白名单添加 ( 方式一 ) 五.白名单添加 ( 方式二 ) Android ...

  6. Android电量优化(1)——了解低电耗模式

    文章目录 了解低电耗模式 将应用调整到低电耗模式 了解应用待机模式 对其他用例的支持 在低电耗模式和应用待机模式下进行测试 了解低电耗模式 如果用户设备未插接电源.处于静止状态一段时间且屏幕关闭,设备 ...

  7. (两百七十)学习 针对低电耗模式和应用待机模式进行优化

    https://developer.android.google.cn/training/monitoring-device-state/doze-standby 针对低电耗模式和应用待机模式进行优化 ...

  8. AlarmManager针对低电耗模式和应用待机模式进行优化

    从 Android 6.0(API 级别 23)开始,Android 引入了两项省电功能,通过管理应用在设备未连接至电源时的行为方式,帮助用户延长电池寿命.当用户长时间未使用设备时,低电耗模式会延迟应 ...

  9. android分屏模式_浅谈 Android 7.0 多窗口分屏模式的实现

    从 Android 7.0 开始,Google 推出了一个名为"多窗口模式"的新功能,也就是我们常说的"分屏模式".那么,这个功能有什么用呢?作为开发者,我们又 ...

  10. android 6.0省电,谷歌发话:强制开启Android 6.0省电模式和全盘加密

    原标题<谷歌发话了:谁都不许动省电模式和全盘加密>,IT之家编辑酌情修改. 日前谷歌已经发布了Android 6.0 Marshmallow的源码,手机厂商们正在加紧为旗下设备的适配工作, ...

最新文章

  1. ATS 5.3.0中开启最高级别的缓存调试信息
  2. GCB | 南土所冯有智组揭示了温度非线性的控制了全球土壤腐生真菌地理学分布...
  3. Ceph 故障修复记录(持续更新)
  4. java_AWT.内存监控
  5. js 中对象--属性相关操作
  6. Python爬虫爬取部分学校的新闻标题、时间、对应的新闻链接
  7. 第三十一讲 非线性微分自治方程组及图解
  8. java变量访问权限_JAVA成员变量的访问权限
  9. Caffe: Vs13添加CUDA支持
  10. java文件调用脚本_Java中调用文件中所有bat脚本
  11. Diango博客--6.Markdown 文章自动生成目录
  12. java方法中的循环里的变量_Java中循环声明变量方法
  13. 非常优秀的iphone学习文章总结!
  14. go语言实战学习笔记
  15. 玩客云实名认证安全吗_玩客云骗局揭秘(真的可以月入万元?)
  16. 上市公司环境数据集:环境绩效明细表、排放明细表、资源消耗明细表等多项指标数据
  17. python提示syntaxerror什么意思_“SyntaxError:print”调用中缺少括号在Python中是什么意思?...
  18. 网络和IP地址计算器
  19. 哪里买. com最便宜?
  20. win10pe命令打开计算机,hp电脑win10如何进pe_惠普电脑怎么进去u盘pe系统

热门文章

  1. 计算机存储单位字节(Byte)以及单位之间的转换
  2. 傲腾内存 可以用ghost系统_光影精灵傲腾版笔记本安装win10系统操作教程
  3. customer-service项目重构总结
  4. 计算机桌面右键新建展不开,Win10右键新建不见了怎么办?Win10电脑桌面右键新建没有了解决方法...
  5. 普通计算机硬件cpu,cpu怎么看型号 教你怎么看电脑cpu型号(软件+硬件)
  6. (一)Activiti 数据库25张表——流程历史记录表20(ACT_HI_DETAIL)
  7. win7如何更改计算机管理员用户名和密码,Win7如何修改管理用户名
  8. 各大快递公司面单号准确性验证的正则表达式
  9. shell笔记_重定向与文本处理命令
  10. 传统方法VS深度学习方法