Android Doze模式和app Standby模式

2024-09-01 22:32
文章标签 android 模式 app standby doze

本文主要是介绍Android Doze模式和app Standby模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对低电耗模式(app Standby)和应用待机模式(Doze)进行针对性优化

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

低电耗模式和应用待机模式管理在 Android 6.0 或更高版本上运行的所有应用的行为,无论它们是否特别针对 API 级别 23。 为确保用户获得最佳体验,请在低电耗模式和应用待机模式下测试您的应用并对代码进行必要的调整。 以下部分介绍了详细信息。

了解低电耗模式

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

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

图 1. 低电耗模式提供了定期维护时段,可供应用使用网络并处理待定 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 与您的应用交互

Google Cloud Messaging (GCM) 是一项云端至设备的服务,允许您支持在后端服务与 Android 设备上的应用之间实时进行下游消息传递。GCM 提供了单一持久的云连接;所有需要实时传递消息的应用均可共享此连接。此共享连接使多个应用无需消耗电池即可维持自身单独的持久连接,避免快速耗尽电池,从而显著优化电池消耗。 因此,如果应用需要与后端服务进行消息传递集成,我们强烈建议您尽量使用 GCM,而非维持自身持久的网络连接。

GCM 经过优化,可通过高优先级 GCM 消息用于低电耗模式和应用待机模式。GCM 高优先级消息允许您可靠地唤醒应用访问网络,即使用户设备处于低电耗模式或应用处于应用待机模式也不例外。 在低电耗模式或应用待机模式下,系统将传递消息并允许应用临时访问网络服务和部分唤醒锁,然后将设备或应用恢复到空闲状态。

高优先级 GCM 消息不会影响低电耗模式,也不会影响任何其他应用的状态。这意味着您的应用可以使用这些消息进行有效的通信,同时尽可能减少对整个系统和设备的电池影响。

作为一项常规最佳做法,如果您的应用需要下游消息传递,则应使用 GCM。如果您的服务器和客户端已经使用 GCM,请确保服务对关键消息使用高优先级消息,因为即使设备处于低电耗模式,这也会可靠地唤醒应用。

对其他用例的支持

通过妥善管理网络连接、闹铃、作业和同步并使用 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 来触发该对话框。
  • 用户可以根据需要手动从白名单中移除应用。

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

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

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

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

在低电耗模式下测试您的应用

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

  1. 使用 Android 6.0(API 级别 23)或更高版本的系统映像配置硬件设备或虚拟设备。
  2. 将设备连接到开发计算机并安装应用
  3. 运行应用并使其保持活动状态
  4. 关闭设备屏幕。(应用保持活动状态。)
  5. 通过运行以下命令强制系统在低电耗模式之间循环切换:
    $ adb shell dumpsys battery unplug     $ adb shell dumpsys deviceidle step
  6. 您可能需要多次运行第二个命令。不断地重复,直到设备变为空闲状态。

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

在应用待机模式下测试您的应用

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

  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. 观察唤醒后的应用行为。确保应用从待机模式中正常恢复。 特别地,您应检查应用的通知和后台作业是否按预期继续运行

加入白名单的可接受用例

下表重点介绍了请求加入或目前位于电池优化豁免白名单中的可接受用例。 通常情况下,除非低电耗模式或应用待机模式破坏了应用的核心功能,或者由于技术方面的原因而导致您的应用无法使用 GCM 高优先级消息,否则您的应用不应出现在白名单上。

如需了解详细信息,请参阅对其他用例的支持。

类型用例是否可以使用 GCM?是否可接受加入白名单?备注
即时通讯、聊天或通话应用。当设备处于低电耗模式或应用处于应用待机模式时,需要将实时消息传递给用户。是,可以使用 GCM不可接受应使用 GCM 高优先级消息唤醒应用并访问网络。
是,但并非使用 GCM 高优先级消息。
即时通讯、聊天或通话应用;企业 VOIP 应用。否,由于在技术上依赖其他消息传递服务,或者低电耗模式和应用待机模式破坏了应用的核心功能,因此不能使用 GCM。可接受 
任务自动化应用应用的核心功能是安排自动化操作,例如即时通讯、语音通话、新照片管理或位置操作。如果适用。可接受 
外围设备协同应用应用的核心功能是保持与外围设备的持久连接,以便为外围设备提供互联网访问权限。如果适用。可接受 
应用只需定期连接到外围设备进行同步,或者只需连接到设备,例如通过标准蓝牙配置文件连接的无线耳机。如果适用。不可接受

Android Doze模式启用和恢复详解:
一、模拟未充电状态
模拟手机在连接USB的状态下的未充电状态。
使用adb命令
我们先用 adb shell dumpsys battery 
这段命令查看一下手机当前的状态,可以看到当前手机是连接USB充电

敲入命令 adb shell dumpsys battery unplug 
模拟手机未充电状态
这时我们看到 AC powered 和 USB powered 都已经关闭,证明模拟手机未充电状态成功。

二、IDLE有效化
敲入命令 adb shell dumpsys deviceidle enable 让IDLE有效化。

三、进入IDLE模式方法
有两种方法。
第一种是,屏幕亮着状态按下电源按钮关闭屏幕,敲入命令让其进入IDLE模式。
(注意:我们在切换状态的时候要重复输入几次命令,直到进入IDLE模式。)
我们可以清晰地看到,手机在重复执行几次之后已经进入IDLE模式。证明第一种方法好用。

第二种是,敲入命令强制让手机进入IDLE模式。
敲入命令 adb shell dumpsys deviceidle force-idle
我们可以敲入命令查看并验证当前手机是否已经进入IDLE模式
敲入命令 adb shell dumpsys deviceidle
我们可以看到手机屏幕当前是开启状态,但是已经进入IDLE模式。证明第二种方法也好用。

四、查看Doze模式白名单
adb shell dumpsys deviceidle whitelist 
把应用加入电池优化白名单的shell命令:
adb shell dumpsys deviceidle whitelist +<packageName>
退出白名单即优化该应用的shell命令为:
adb shell dumpsys deviceidle whitelist -<packageName>

五、恢复手机状态
当我们模拟完状态之后要恢复回去,以便手机能够正常使用。
敲入命令 adb shell dumpsys deviceidle disable 和 adb shell dumpsys battery reset 即可让手机恢复状态。
再敲入 adb shell dumpsys battery 查看一下手机是否已经恢复状态。
我们可以看到,手机已经从IDLE模式恢复到正常状态。

Standby应用,也就是休眠应用(可以理解为墓碑机制,我这么理解的)累死绿色守护的浅睡模式。
以休眠QQ为例子,具体命令:
adb shell dumpsys battery unplug
adb shell am set-inactive com.tencent.mobileqq true

这篇关于Android Doze模式和app Standby模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128228

相关文章

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的