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

相关推荐
Eastsea.Chen2 小时前
MTK Android12 user版本MtkLogger
android·framework
长亭外的少年9 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
建群新人小猿12 小时前
会员等级经验问题
android·开发语言·前端·javascript·php
1024小神13 小时前
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
android·ios·tauri
兰琛13 小时前
20241121 android中树结构列表(使用recyclerView实现)
android·gitee
Y多了个想法14 小时前
RK3568 android11 适配敦泰触摸屏 FocalTech-ft5526
android·rk3568·触摸屏·tp·敦泰·focaltech·ft5526
NotesChapter15 小时前
Android吸顶效果,并有着ViewPager左右切换
android
_祝你今天愉快16 小时前
分析android :The binary version of its metadata is 1.8.0, expected version is 1.5.
android
暮志未晚Webgl16 小时前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5
麦田里的守望者江16 小时前
KMP 中的 expect 和 actual 声明
android·ios·kotlin