电量优化
问题
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: 如何检测应用的电量消耗?
答案:
- Battery Historian:通过
adb bugreport生成电量消耗报告 - Energy Profiler:Android Studio 中实时查看电量消耗估算
- dumpsys:
adb shell dumpsys batterystats --charged <package>
Q2: 前台服务和后台服务对电量的影响?
答案:
- 前台服务(Notification 可见):不受 Doze 限制,但用户可感知
- 后台服务:Android 8.0+ 严格限制后台 Service,推荐使用 WorkManager