Android  Doze and App Standby模式详解

来源:腾云阁 https://www.qcloud.com/community

Optimizing for Doze and App Standby

  1. 从Android6.0开始,Android提供了两种省电延长电池寿命的功能:Doze和App Standby;

  2. 表现形式:当设备没有连接到电源,设备进入Doze模式时,系统将通过延迟最近用户没有使用的应用程序的后台CPU运作及网络活动,让应用程序处于App Standby状态,以此来减少电池消耗。谷歌表示,在Nexus5和Nexus6上测试,当屏幕处于关闭状态,平均续航时间提高30%;

  3. 版本要求:Android6.0(API level 23)及其更高版本;

  4. 开发者影响:为了保证用户的最佳体验,开发者有必要在Doze和App Standby模式下测试应用程序,及其对代码进行相应的调整。

Understanding Doze

1.设备进入Doze睡眠模式时机:

  • 用户不操作设备一段时间

  • 屏幕关闭

  • 设备未连接电源充电

2.Doze模式下应用程序有什么变化:

  • 系统试图通过限制应用程序访问网络和CPU密集型服务节省电池;

  • 防止应用程序访问网络,推延应用程序的工作,同步,和标准的警报;

  • 系统定期提供一个短暂的时间让应用程序完成延迟的工作活动,在这个时间片里,系统将提供维持性窗口应用程序访问网络,运行在等待的同步,工作,和报警等活动。

Doze模式的五种状态,分别如下:

ACTIVE:手机设备处于激活活动状态

INACTIVE:屏幕关闭进入非活动状态

IDLE_PENDING:每隔30分钟让App进入等待空闲预备状态

IDLE:空闲状态

IDLE_MAINTENANCE:处理挂起任务

如下图所示,Doze期间提供间隔一小段时间(30s)供应用程序使用网络和处理挂起的活动。

从这张图我们可以看到,系统进入Doze模式后,系统会隔一段时间处理正在挂起的任务,随着时间推移,后面间隔的时间会越来越长,以此来减少电量消耗。

3.退出Doze模式(系统退出休眠,所有的应用程序恢复正常活动):

  • 用户唤醒装置移动,打开屏幕

  • 或者设备连接电源

4.Doze有哪些限制?

  • 网络连接会被禁止

  • Wake Lock会被屏蔽

  • AlarmManager定时任务延迟到下一个maintenance window进行处理,除非使用AlarmManager提供的方法:setAndAllowWhileIdle() 或者setExactAndAllowWhileIdle()

  • 系统将不扫描热点WIFI

  • 同步工作将被禁止

  • 不允许JobScheduler进行任务调度

5.适配Doze模式有什么方法?

  • Doze影响到AlarmManager闹钟和定时器管理活动,在Android6.0引入了两个新方法:setAndAllowWhileIdle() 和setExactAndAllowWhileIdle(),调用两个方法可以在Doze模式下让系统响应定时任务

  • Doze模式下限制了网络的连接,如果应用程序依赖于实时信息,那么这个将影响App的体验。那么你需要使用Google Cloud Messaging (GCM)谷歌云消息(后面详细讲解)

6.测试Doze和App Standby模式的方法(Adb命令)

测试Doze模式

  1. 首先确保你的硬件或虚拟设备是Android6.0或更高版本系统;

  2. 连接设备到开发机上并安装你的app;

  3. 运行app并让其运行活动;

  4. 关闭设备的屏幕;

  5. 运行以下adb命令使系统进入Doze模式:

    $ adb shell dumpsys battery unplug

    $ adb shell dumpsys deviceidle step

  6. 观察你的app表现行为是否有需优化改进的地方。

测试App Standby模式

步骤1-3同测试Doze模式

  1. 运行以下adb命令迫使系统进入App Standby模式:

    $ adb shell dumpsys battery unplug

    $ adb shell am set-inactive true

  2. 模拟唤醒你的应用程序使用以下命令:

    $ adb shell am set-inactive false

    $ adb shell am get-inactive

  3. 观察你的App,确保应用程序恢复正常从待机模式过程中,App的通知及其背部活动能达到预期结果。

Understanding App Standby

当用户不触摸使用应用程序一段时间时,该应用程序处于App Standby状态,系统将把该App标志为空闲状态。除非触发以下任意条件,应用程序将退出App Standby状态:

  1. 用户主动启动该App;

  2. 该App当前有一个前台进程(或包含一个活动的前台服务,或被另一个activity或前台service使用);

  3. App生成一个用户所能在锁屏或通知托盘看到的Notification, 而当用户设备插入电源时,系统将会释放App的待机状态,允许他们自由的连接网络及其执行未完成的工作和同步。如果设备空闲很长一段时间,系统将允许空闲App一天一次访问网络。

Doze和App Standby的区别:

Doze模式需要屏幕关闭(通常晚上睡觉或长时间屏幕关闭才会进入),而App Standby不需要屏幕关闭,App进入后台一段时间也会受到连接网络等限制。

Using GCM to Interact with Your App While the Device is Idle

1. 什么是GCM?

Google Cloud Messaging(GCM)是一个云到设备的服务,可以让你支持实时在云端服务和Android设备上应用程序之间的消息传递。

GCM提供了一个持久连接到云端的链接,让所有需要实时消息传递应用程序可以共享此链接。这个共享链接显著优化电池消耗,使其不必让多个应用程序各位维护自己单独的持久链接而使电池迅速耗尽。

由于这个原因,官方建议:如果你的应用需要消息传递与后端服务集成,我们强烈建议尽可能的使用GCM,而不是单独维护自己的网络链接。

GCM消息拥有高优先级,不影响Doze模式,且不会不影响其他应用程序的状态。这意味着你的应用程序可以使用它们进行通信,同时最大限度地减少电池在整个系统和设备的影响。

以下来GCM自官方解释:

一个GCM实现包括谷歌连接服务器,在你的环境中通过HTTP或XMPP协议的连接服务器进行交互的应用程序服务器和客户端应用程序。

生命周期流程:

  • 注册启用GCM: 客户端应用程序注册为接收消息。

  • 发送和接收下行消息:

发送一个消息,该应用程序服务器发送信息到客户端应用程序:

1.该应用程序服务器发送消息给GCM连接服务器;

2.当设备处于脱机状态,该GCM连接服务器入队并存储消息;

3.当设备联机时,GCM连接服务器将邮件发送到该设备;

4.在设备上,所述客户端应用程序根据该特定平台实现接收该消息。

接收消息,客户端应用程序收到一条消息从GCM连接服务器。

发送和接收上游的消息: 如果您使用的是此功能只提供XMPP连接服务器 。

发送一个消息,客户端应用程序将消息发送到应用服务器:

1.在设备上,客户端应用程序将消息发送到XMPP连接server;

2.如果该服务器已断开连接,该XMPP服务器连接入队并存储信息;

3.当应用程序服务器重新连接后,XMPP连接服务器将邮件发送到应用程序服务器。

接收消息,一个应用服务器从XMPP连接服务器接收邮件,然后执行以下操作:

1、解析消息头,以验证客户端应用程序发送的信息;

2、发送“确认”的XMPP连接服务器以确认收到该消息;

3、任选解析该消息有效载荷,由客户端应用程序所定义的。

除了GCM,Android6.0及更高版本还提供了Doze模式白名单列表,通过设置应用程序进入白名单列表可逃脱Doze模式的各种限制。

检测应用程序是否存在白名单list里面,可使用PowerManager的isIgnoringBatteryOptimizations()方法。

用户也可手动设置应用程序进入白名单列表里面,路径为:设置>电池>电池优化白名单:

客户端使用方法:

  1. App程序可发送action为ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS的intent引导用户进入设置界面将应用程序设置进白名单列表里。

  2. 应用程序还可以使用AREQUEST_IGNORE_BATTERY_OPTIMIZATIONS 权限来触发一个系统对话来让用户添加到白名单里,而无需进入设置界面去设置。

当然,官方也提供用户把你的App移除电池优化白名单的选项。这个白名单也会被Android M的另一个新特性 App Standby使用,所以用户只能简单的进行控制,也就是说设备并不会完全相信这个白名单。

官方举了一下白名单例子:

$ adb shell dumpsys deviceidle whitelist +

$ adb shell dumpsys deviceidle

总结:

Doze模式的推出本身是为了减少电池的消耗,且Google希望统一使用GCM来传递消息进行通讯,而对于国内开发来讲,确实带来了很大的麻烦:

  1. 国内开发的一些消息推送机制(PUSH)将受到影响;

  2. 若使用GCM,在国内使用GCM延迟高,对于即时通讯产品来说选择还需勇气啊;

  3. 国内第三方手机厂商如华为、小米、三星,定制的Rom也将使用定制的推送消息机制。这让同一款App如何选择哪种推送机制才能兼容呢?

解决方法:

  1. 用户添加应用程序到电池优化白名单列表;

  2. 开发者使用Google提供的ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS意图和AREQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限设置以此忽略(推荐);

  3. 使用Google提供的GCM;

  4. 通过so绕过Doze模式。

Android  Doze and App Standby模式详解相关推荐

  1. Android M新特性Doze and App Standby模式详解

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/52312122 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...

  2. android 状态模式,Android编程设计模式之状态模式详解

    本文实例讲述了Android编程设计模式之状态模式.分享给大家供大家参考,具体如下: 一.介绍 状态模式中的行为是由状态来决定的,不同的状态下有不同的行为.状态模式和策略模式的结构几乎完全一样,但它们 ...

  3. java备忘录模式 类图,Android编程设计模式之备忘录模式详解

    本文实例讲述了Android编程设计模式之备忘录模式.分享给大家供大家参考,具体如下: 一.介绍 备忘录模式是一种行为模式,该模式用于保存对象当前状态,并且在之后可以再次恢复到此状态,这有点像我们平时 ...

  4. Android Activity Launch Mode 启动模式详解

    简介 android:launchMode 属性能设置 Activity 对象启动时是否使用已有的实例还是多次创建,会使得交互设计更加良好,也能避免很多问题. 它是 Androidmanifest.x ...

  5. Android M的App Links实现详解

    谷歌2015年的I/O大会上宣布了一个 新特性 (http://www.androidpolice.com/2015/05/28/io-2015-android-m-will-support-app- ...

  6. Android WiFi从app到driver详解

    分三大部分: (1)    Wifi模块相关文件的解析 (2)    Wpa_supplicant解析 (3)    Wifi的启动流程(有代码供参考分析) 一,Wifi模块相关文件解析 1)     ...

  7. Android studio | Android studio下APP目录工程结构详解

    /********************************************************************* github:https://github.com/Mic ...

  8. android mvvm流程图,MVVM框架模式详解

    MVVM 定义 MVVM 是 Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对 View 和 ViewModel 的双向数据绑定,这使得 ViewMod ...

  9. [车联网安全自学篇] Android安全之Android 如何生成APP(APK)「详解」

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 0x01 前言 面向移动终端的操作系统有:Symbian.P ...

最新文章

  1. keras从入门到放弃(三)逻辑回归 softmax
  2. vue --- cdn导入,一些基本操作
  3. Ubuntu中安装、生成、导入、导出、Python3虚拟环境
  4. 多进程模块multiprocessing
  5. 最长递增子序列LIS再谈
  6. 打开php网页中木马,常见PHP网页木马
  7. PNG生成多尺寸ico文件,开发桌面应用必备
  8. android游戏flash插件下载,Flash Game Player Classic
  9. 我的世界租赁服自定义服务器,我的世界租借服务器(我的世界技巧教程 租赁服务器玩家间传送功能)...
  10. ★关于人类体质弱化的分析
  11. 体验灵魂出窍:错觉延伸人体对自身感觉
  12. 浏览器LocalStorage和SharedWorker跨标签页通信-连载2
  13. RT-Thread Studio学习(十一)IIC
  14. DB2数据库配置db cfg
  15. Android默认设置MTP模式
  16. Exynos_4412——WDT实验
  17. 订单23系统服务器,《死亡搁浅》订单23怎么完成?系统服务器订单任务攻略
  18. 水库安全监测自动化系统解决方案
  19. SwiftUI:属性装饰器的理解@State,@Binding,@ObservedObject,@Published,@Environment,@EnvironmentObject
  20. C# 读取Excel日期格式

热门文章

  1. python获取计算机信息系统数据罪_使用 python 收集获取 Linux 系统主机信息
  2. 移植qt常见错误修改方法
  3. java 流 flush_Java CharArrayWriter flush()方法
  4. webpack3.0 压缩css 但是不在html中引用,webpack怎样压缩css?
  5. 基于socket的C语言编程,C语言实现的Socket编程
  6. app抢购脚本如何编写_如何用1个记事本文件征服全世界?——cmd批处理脚本编写...
  7. ios 按钮图片拉伸_#UIButton#背景图片的拉伸
  8. java基础第五篇封装与面向对象
  9. 04-树6 Complete Binary Search Tree
  10. mysql - 索引_07