一文了解Android的Doze模式

Android 的 Doze 模式是一项省电功能,主要用于减少设备的功耗,特别是在屏幕关闭且设备长时间未被使用的情况下。Doze 模式在 Android 6.0(API Level 23)首次引入,并在后续版本中不断改进,以便更智能地管理后台任务和应用的资源消耗。
在这里插入图片描述
下面详细介绍 Doze 模式的工作原理、不同阶段及其对应用开发的影响。

1. 什么是 Doze 模式?

Doze 是 Android 的一项电量优化机制。当设备不在充电状态、屏幕关闭且长时间静止(如平放在桌子上)时,系统会进入 Doze 模式。此时,设备会逐渐减少 CPU、网络和其他资源的消耗,从而达到延长电池续航的目的。

2. Doze 模式的工作原理

Doze 模式的核心思想是通过限制设备的活动,将设备置于“浅睡眠”和“深睡眠”状态。设备在进入 Doze 模式后会经历多个阶段,每个阶段对应用的活动限制不同。

Doze 模式的几个关键阶段:
  1. 初始 Doze 模式:设备检测到长时间未使用后,会进入初始的 Doze 模式,此时设备会暂停大多数后台工作,但会定期打开“维护窗口”来处理必要的任务,如同步数据和消息处理。
  2. 深度 Doze 模式:随着设备继续保持静止且不被使用,系统会进入深度 Doze 模式。此时“维护窗口”会变得更加稀疏,应用的后台工作被更加严格地限制。
Doze 模式的醒来机制

在 Doze 模式中,系统会每隔一段时间唤醒设备,打开一个短暂的“维护窗口”,让应用可以执行关键操作。这些维护窗口的频率会随着设备静止时间的延长而减少,从而进一步节省电量。

3. Doze 模式的应用限制

在 Doze 模式下,系统会限制应用的行为,以减少电池消耗。以下是 Doze 模式的主要限制:

  • 后台任务:大部分后台任务、定时器和网络请求会被暂停。
  • 闹钟:大多数的 AlarmManager 任务(包括 setExact 和 setWindow 类型)都会被推迟,直到下一个“维护窗口”。
  • 网络访问:应用的网络访问将会受到限制,仅在“维护窗口”期间才允许联网。
  • Wakelocks:大多数 wakelocks 将被系统无视,避免阻止设备进入低功耗状态。

4. 如何适配 Doze 模式?

在开发 Android 应用时,适配 Doze 模式的关键是确保应用在受限环境中仍能正常工作。以下是一些适配 Doze 模式的方法和 API:

1. 使用 JobScheduler API

JobScheduler API 允许在系统资源受限的情况下安排任务。使用 JobScheduler 可以让你的任务在 Doze 模式下的“维护窗口”中执行。

val jobScheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
val jobInfo = JobInfo.Builder(1, ComponentName(this, MyJobService::class.java)).setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED).setRequiresCharging(false).setPersisted(true).build()
jobScheduler.schedule(jobInfo)
2. 使用 Firebase JobDispatcher(已被 WorkManager 取代)

Firebase JobDispatcher 过去曾经是一种跨平台的任务调度方式,但在更高版本的 Android 中,推荐使用 WorkManager 代替它。

3. 使用 WorkManager

WorkManager 是 Android 提供的现代任务调度库,可以确保任务在适当的时机被执行,即使应用受到 Doze 模式的影响。

val workRequest = OneTimeWorkRequest.Builder(MyWorker::class.java).setConstraints(Constraints.Builder().setRequiredNetworkType(NetworkType.UNMETERED).setRequiresCharging(false).build()).build()
WorkManager.getInstance(context).enqueue(workRequest)

5. 例外情况:请求白名单

在极少数情况下,如果应用需要在 Doze 模式下不受限制运行(例如处理重要的消息或通知),可以请求加入 Doze 的白名单。这通常适用于关键任务应用,比如消息或医疗监控应用。

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>

但需要注意的是,用户需要手动允许应用加入白名单,且此操作会影响设备的电量管理策略。

6. Doze 模式的最佳实践

  • 使用 WorkManager 或 JobScheduler 来处理后台任务。
  • 避免使用精确的闹钟或频繁的后台任务。
  • 对网络请求和资源的使用进行优化,减少不必要的资源消耗。
  • 避免在不必要的情况下请求白名单权限,保持应用电量友好。

7. 总结

Doze 模式是 Android 的电量优化策略,通过限制后台任务、网络访问等来延长设备的续航时间。开发者在适配 Doze 模式时,需要合理使用任务调度 API(如 WorkManagerJobScheduler),确保应用在有限资源的情况下仍然可以正常运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/60062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美团代付微信小程序系统 read.php 任意文件读取漏洞复现

0x01 产品简介 美团代付微信小程序系统是美团点评旗下的一款基于微信小程序技术开发的应用程序功能之一,它允许用户方便快捷地请求他人为自己支付订单费用。随着移动支付的普及和微信小程序的广泛应用,美团作为中国领先的本地生活服务平台,推出了代付功能,以满足用户多样化…

SpringBoot-员工管理系统(1)

目录 一、首页配置 二、国际化 2.1 配置文件编写 2.2 使配置文件生效 2.3 配置页面国际化值 2.4 实现根据按钮自动切换中英文 三、登录拦截器 一、首页配置 1、所有页面的静态资源都需要用thymeleaf接管 2、url使用{}格式 二、国际化 2.1 配置文件编写 1、在resourc…

JavaSE:初识Java(学习笔记)

java是高级语言的面向对象语言 .[最贴近生活.最快速分析和设计程序] 一&#xff0c;计算机语言发展历史 二&#xff0c;Java体系结构 1&#xff0c;JavaSE&#xff08;Java Standard Edition&#xff09; 标准版&#xff0c;定位在个人计算机上的应用 这个版本是Jav…

Android——多线程、线程通信、handler机制

Android——多线程、线程通信、handler机制 模拟网络请求&#xff0c;会阻塞主线程 private String getStringForNet() {StringBuilder stringBuilder new StringBuilder();for (int i 0; i < 100; i) {stringBuilder.append("字符串" i);}try {Thread.sleep(…

Jumpserver

概述 一款开源的堡垒机&#xff0c;可使系统的管理员和开发人员安全的连接到企业内部服务器上执行操作&#xff0c;是一款非常安全的远程连接工具。 4A 身份验证授权控制账号管理安全审计 安装 [rootjumpserver project]# tar -xf jumpserver-offline-installer-v2.28.6-amd64…

【专题】2024年全球生物医药交易报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p38191 在当今复杂多变的全球经济环境下&#xff0c;医药行业正面临着诸多挑战与机遇。2024 年&#xff0c;医药行业的发展态势备受关注。 一方面&#xff0c;全球生物医药交易活跃&#xff0c;2021 - 2023 年的交易中&#xff0c;已…

统信UOS开发环境支持rust

集成了Rust编译器和包管理工具,支持系统级编程、网络应用等多场景,为开发者提供丰富的库支持。 文章目录 一、环境部署1. rust开发环境安装2. rust开发环境配置二、代码示例三、常见问题1. 借用和所有权问题2. 编译器错误和警告一、环境部署 1. rust开发环境安装 rust是一门…

Addressables资源打包(AA包)代码中改变远程地址

接着上一篇“Unity资源打包Addressable AA包” 还是先贴代码 LoadPath.cs 中定义一个远程服务器的地址&#xff0c;这个地址将来在代码中会修改 namespace HFS {public class LoadPath{public static string Path "http://172.18.216.168:6565/HFS/1/";} } 远程服…

linux基础-完结(详讲补充)

linux基础-完结 一、Linux目录介绍 二、基础命令详细讲解 1. ls&#xff08;列出目录内容&#xff09; 2. cd&#xff08;更改目录&#xff09; 3. clear&#xff08;清除终端屏幕&#xff09; 4. pwd(显示你当前所在的目录) 5. vim(文本编辑器) 6. touch&#xff08;创…

开启鸿蒙开发之旅:准备篇

写在前面 Q:为什么要学习鸿蒙&#xff1f; A:没有特定的理由&#xff0c;有可能是因为大环境不好的原因&#xff0c;大家越来越卷&#xff0c;技术革新越来越快&#xff0c;如果手里多掌握一门技术&#xff0c;心里会更有底气一些。再一个自己只有前端开发经验&#xff0c;平时…

倒计时3天 | 2024 CCF中国开源大会仪式解读

点击蓝字 关注我们 CCF Opensource Development Committee CCF 大会简介 2024 CCF中国开源大会&#xff08;CCF ChinaOSC&#xff09;将于2024年11月9日至10日在深圳召开。本届大会由中国计算机学会主办&#xff0c;CCF开源发展委员会、鹏城实验室、新一代人工智能产业技术创新…

硬件基础17 半导体存储器——随机存取存储器RAM

目录 一、异步SRAM 二、同步SRAM 三、DRAM 四、字长位数扩展 五、字数的扩展 RAM是另一大类存储器&#xff0c;它与ROM的最大区别就是数据易失性&#xff0c;一旦失去电源供电&#xff0c;所存储的数据立即丢失。最大优点是可以随时快速地从其中任一指定地址读出&#xff…

安装VMware Tools选项显示灰色以及连接不上服务器,下载出错的正确解决办法

1.显示灰色解决办法&#xff1a; 解决办法&#xff1a; 关闭虚拟机 选择“虚拟机设置”&#xff0c;分别添加一个“软盘”和一个“CD/DVD”&#xff0c;并将所有软盘和CD/DVD&#xff08;包括自带的&#xff09;“连接”选项全部更改为“使用物理驱动器” 2.关闭虚拟机重启即…

git中使用tag(标签)的方法及重要性

在Git中打标签&#xff08;tag&#xff09;通常用于标记发布版本或其他重要提交。 Git中打标签的步骤&#xff1a; 列出当前所有的标签 git tag创建一个指向特定提交的标签 git tag <tagname> <commit-hash>创建一个带注释的标签&#xff0c;通常用于发布版本 git…

BMC运维管理:IPMI实现服务器远控制

IPMI实现服务器远控制 实操一、使用IPMI重置BMC用户密码实操二、使用IPMI配置BMC的静态IP实操三、IPMI实现BMC和主机控制操作实操四、ipmitool查看服务器基本信息实操五、ipmitool实现问题定位BMC(Baseboard Management Controller,基板管理控制器)是服务器硬件的一个独立管…

Android Profiler 内存分析

Android studio&#xff08;下面简称AS&#xff09;为App提供的性能分析工具&#xff0c;在AS3.0替换掉旧的分析工具&#xff0c;对于其使用方法&#xff0c;官方也有对应的介绍&#xff1a;Android Profiler 对于使用方法&#xff0c;我只用到比较简单的功能&#xff0c;高级的…

vue3 基于element-plus进行的一个可拖动改变导航与内容区域大小的简单方法

1、先上个截图&#xff1a; 说明&#xff1a;拖动上面的分隔栏就可以实现&#xff0c;改变左右区域的大小。 2、上面的例子来自官网的&#xff1a; Container 布局容器 | Element Plus 3、拖动的效果来自&#xff1a; https://juejin.cn/post/7029640316999172104#heading-1…

adminPage-vue3依赖DetailsModule版本说明:V1.2.1——1) - 新增span与labelSpan属性

文章目录 更新内容DetailsModuleAPI汇总属性自定义对象config.list(array<object> 类型) 使用span属性&#xff08;24栅格系统&#xff09; 更新内容 新增span与labelSpan属性&#xff0c;当使用span属性时将不适用默认的布局&#xff0c;如果24栅格系统进行重新布局 D…

系统聚类的分类数确定——聚合系数法

breast_cancer数据集分析——乳腺癌诊断 #读取乳腺癌数据 import pandas as pd import numpy as np from sklearn.datasets import load_breast_cancer data load_breast_cancer() X data.data y data.target.. _breast_cancer_dataset:Breast cancer wisconsin (diagnosti…

Android 实现柱形图

在 Android 中实现柱状图&#xff0c;可以使用流行的图表库 MPAndroidChart&#xff0c;它支持多种类型的图表&#xff0c;包括柱状图、折线图、饼图等。下面是一个基本的柱状图实现步骤&#xff0c;具体分为以下几个部分&#xff1a; 1. 添加依赖 首先&#xff0c;你需要在 …