一文了解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),确保应用在有限资源的情况下仍然可以正常运行。

相关推荐
檀越剑指大厂3 小时前
容器化 Android 开发效率:cpolar 内网穿透服务优化远程协作流程
android
MiyamuraMiyako4 小时前
从 0 到发布:Gradle 插件双平台(MavenCentral + Plugin Portal)发布记录与避坑
android
NRatel4 小时前
Unity 游戏提升 Android TargetVersion 相关记录
android·游戏·unity·提升版本
叽哥7 小时前
Kotlin学习第 1 课:Kotlin 入门准备:搭建学习环境与认知基础
android·java·kotlin
风往哪边走7 小时前
创建自定义语音录制View
android·前端
用户2018792831677 小时前
事件分发之“官僚主义”?或“绕圈”的艺术
android
用户2018792831677 小时前
Android事件分发为何喜欢“兜圈子”?不做个“敞亮人”!
android
Kapaseker9 小时前
你一定会喜欢的 Compose 形变动画
android
QuZhengRong9 小时前
【数据库】Navicat 导入 Excel 数据乱码问题的解决方法
android·数据库·excel
zhangphil10 小时前
Android Coil3视频封面抽取封面帧存Disk缓存,Kotlin(2)
android·kotlin