当前位置: 首页 > article >正文

一文了解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.kler.cn/a/384550.html

相关文章:

  • 【Spring】Spring Web MVC基础入门~(含大量例子)
  • Python 基础笔记之生成器generator
  • vue:Transition
  • 基于 EventBridge + DashVector 打造 RAG 全链路动态语义检索能力
  • GooglePlay: 应用和游戏的内容分级
  • 第18篇 :关于SystemVerilog中的约束随机机制(一)
  • 前端开发设计模式——原型模式
  • Linux文件系统详解
  • 【Axure高保真原型】视频列表播放器
  • 计算机网络-以太网小结
  • Hive中各种Join的实现
  • Windows系统使用OpenSSL生成自签名证书
  • pnpm管理多工作区依赖
  • Oracle-日期转换
  • 数据结构-数组(稀疏矩阵转置)和广义表
  • 【全网最新】Pycharm安装 并完成正常使用 Anaconda3最新版安装教程 搭配Pycharm 调试Anaconda3
  • Django设计响应数据结构
  • web前端
  • navicat pg库安装mysql fdw 外表扩展
  • Call For Speaker! |2025中国国际音频产业大会(GAS)演讲嘉宾征集令启动!
  • 后端Node学习项目-项目基础搭建
  • linux下linuxdeployqt打包过程
  • Xserver v1.4.2发布,支持自动重载 nginx 配置
  • Golang--协程和管道
  • 飞腾平台Arm ComputeLibrary编译安装指南
  • canal1.1.7使用canal-adapter进行mysql同步数据