问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

一文了解Android的Doze模式

创作时间:
作者:
@小白创作中心

一文了解Android的Doze模式

引用
CSDN
1.
https://blog.csdn.net/wudexiaoade2008/article/details/143581627

Android的Doze模式是一项重要的省电功能,通过限制后台任务和网络访问来延长设备续航。本文详细介绍了Doze模式的工作原理、不同阶段及其对应用开发的影响,并提供了适配Doze模式的最佳实践。

什么是Doze模式?

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

Doze模式的工作原理

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

Doze模式的几个关键阶段:

  1. 初始Doze模式:设备检测到长时间未使用后,会进入初始的Doze模式,此时设备会暂停大多数后台工作,但会定期打开“维护窗口”来处理必要的任务,如同步数据和消息处理。

  2. 深度Doze模式:随着设备继续保持静止且不被使用,系统会进入深度Doze模式。此时“维护窗口”会变得更加稀疏,应用的后台工作被更加严格地限制。

Doze模式的醒来机制

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

Doze模式的应用限制

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

  • 后台任务:大部分后台任务、定时器和网络请求会被暂停。

  • 闹钟:大多数的AlarmManager任务(包括setExact和setWindow类型)都会被推迟,直到下一个“维护窗口”。

  • 网络访问:应用的网络访问将会受到限制,仅在“维护窗口”期间才允许联网。

  • Wakelocks:大多数wakelocks将被系统无视,避免阻止设备进入低功耗状态。

如何适配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)
  1. 使用Firebase JobDispatcher(已被WorkManager取代)

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

  1. 使用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)

例外情况:请求白名单

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

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

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

Doze模式的最佳实践

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

总结

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

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号