跳到主要内容

电量优化

问题

Android 应用的常见耗电原因有哪些?如何优化?

答案

耗电大户

来源说明优化
网络请求蜂窝网络的 Radio 唤醒批量请求、减少轮询
GPS 定位持续高精度定位使用 Fused Location、降低频率
WakeLock阻止 CPU 休眠限时使用、及时释放
后台服务持续运行改用 WorkManager
频繁唤醒AlarmManager 频繁触发使用 inexact alarm

Doze 模式与 App Standby

Android 6.0+ 引入 Doze 模式,设备静止一段时间后限制后台活动:

Doze 模式下受限:

  • 网络访问暂停
  • WakeLock 被忽略
  • AlarmManager 延迟到维护窗口
  • JobScheduler 暂停
  • Wi-Fi 扫描暂停

WakeLock 最佳实践

// ✅ 正确使用 WakeLock
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
val wakeLock = powerManager.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK,
"MyApp::SyncWakeLock"
).apply {
acquire(10 * 60 * 1000L) // 设置超时!避免永久持有
}

try {
doSync()
} finally {
if (wakeLock.isHeld) wakeLock.release()
}

// ❌ 永远不要这样
wakeLock.acquire() // 没有超时,忘记 release 就永久耗电

网络优化策略

// 使用 WorkManager 批量同步而非频繁请求
val syncRequest = PeriodicWorkRequestBuilder<SyncWorker>(1, TimeUnit.HOURS)
.setConstraints(
Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED) // 仅 WiFi
.setRequiresBatteryNotLow(true) // 电量充足
.build()
)
.build()

常见面试问题

Q1: 如何检测应用的电量消耗?

答案

  1. Battery Historian:通过 adb bugreport 生成电量消耗报告
  2. Energy Profiler:Android Studio 中实时查看电量消耗估算
  3. dumpsysadb shell dumpsys batterystats --charged <package>

Q2: 前台服务和后台服务对电量的影响?

答案

  • 前台服务(Notification 可见):不受 Doze 限制,但用户可感知
  • 后台服务:Android 8.0+ 严格限制后台 Service,推荐使用 WorkManager

相关链接