一文了解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 模式下的"维护窗口"中执行。

kotlin 复制代码
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 模式的影响。

kotlin 复制代码
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 的白名单。这通常适用于关键任务应用,比如消息或医疗监控应用。

xml 复制代码
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>

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

6. Doze 模式的最佳实践

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

7. 总结

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

相关推荐
jiayong231 小时前
MySQL 排序规则冲突问题与 utf8mb4_general_ci 统一方案
android·mysql·ci/cd
随遇丿而安2 小时前
第6周:RecyclerView 真正难的不是“写个列表”,而是让列表在复用中保持正确
android
晓梦林2 小时前
EVA靶场学习笔记
android·笔记·学习
私人珍藏库2 小时前
【Android】抖音无水印下载安卓端 轻载 QingZai v1.0.4
android·app·工具·软件·多功能
qq3621967053 小时前
Twitter官网下载安装指南:2026最新安卓版APK教程
android·twitter
盼小辉丶3 小时前
PyTorch深度学习实战(55)——在Android上部署PyTorch模型
android·pytorch·python·模型部署
ImTryCatchException3 小时前
Android 卡顿诊断实战:从“感觉卡“到“精准定位“的方法论
android
vensli3 小时前
Wolverine:杀不死的 Android 进程保活方案
android
Meteors.13 小时前
安卓源码阅读——01.grade设置binding为true时,xml如何进行映射
android·xml
_李小白14 小时前
【android opencv学习笔记】Day 26: 滤波算法之低通滤波与图像缩放插值
android·opencv·学习