Skip to content

电池优化

鸿蒙应用电池优化:后台保活、定位策略、唤醒锁、CPU 频率管理。


1. 耗电原因分析

1.1 耗电大户

应用耗电排行:
├─ 网络通信(WiFi/移动数据) ████████████████
├─ GPS 定位 ██████████████
├─ 屏幕显示 ████████████
├─ CPU 计算 ████████
├─ 传感器 ██████
└─ 音频播放 ███

1.2 省电优先级

省电优先级(从高到低):
1. 减少网络请求(批量/缓存/压缩)
2. 优化 GPS 定位策略
3. 缩短屏幕亮度/超时时间
4. 降低 CPU 占用(异步/延迟)
5. 使用 Doze 模式

2. 后台任务优化

2.1 减少后台活跃

typescript
import { workScheduler } from '@kit.BackgroundTaskKit'

// ❌ 错误:频繁后台任务
// 每分钟执行一次
let workRequest1 = workScheduler.createWorkRequest({
    workName: 'syncData',
    interval: 60000  // 太频繁!
})

// ✅ 正确:利用网络约束,只在 WiFi 时同步
let workRequest2 = workScheduler.createWorkRequest({
    workName: 'syncData',
    interval: 3600000,  // 每小时
    constraints: {
        networkType: workScheduler.NetworkType.UNMETERED  // WiFi 才执行
    }
})

2.2 合并后台任务

typescript
// ❌ 错误:多个任务分别执行
TaskPool.execute(() => this.syncUsers())
TaskPool.execute(() => this.syncPosts())
TaskPool.execute(() => this.syncComments())

// ✅ 正确:合并为一个批量任务
TaskPool.execute(() => {
    this.syncUsers()
    this.syncPosts()
    this.syncComments()
})

3. 定位策略优化

3.1 定位精度选择

定位精度 vs 耗电:
├─ High accuracy(GPS + WiFi + 基站)→ 高耗电
├─ Battery saving(WiFi + 基站)→ 中等
└─ Device only(GPS)→ 低耗电(但信号差时耗电)

推荐:根据场景选择合适精度

3.2 定位策略

typescript
import { location } from '@kit.LocationKit'

// ❌ 错误:高频定位
let highFreqLocation = location.createLocationClient({
    priority: location.LocationPriority.HIGH,
    interval: 1000  // 每秒更新
})

// ✅ 正确:按需定位
let onDemandLocation = location.createLocationClient({
    priority: location.LocationPriority.BATTERY_SAVING,  // 省电模式
    interval: 30000  // 30 秒更新
})

// 需要高精度时临时切换
async function getHighAccuracyPosition(): Promise<Location> {
    let client = location.createLocationClient({
        priority: location.LocationPriority.HIGH,
        interval: 0  // 单次获取
    })
    let position = await client.getLastLocation()
    client.stopListening()  // 用完即停
    return position
}

4. 唤醒锁管理

4.1 WakeLock

typescript
import { powerManagement } from '@kit.PowerManagementKit'

// 获取 WakeLock
let wakeLock = await powerManagement.createWakeLock(
    powerManagement.WakeLockType.PARTIAL_WAKE_LOCK
)

// 唤醒 CPU
await wakeLock.acquire()

// 使用 CPU
await this.doHeavyComputation()

// 释放 WakeLock(及时释放!)
await wakeLock.release()

4.2 WakeLock 最佳实践

✅ 推荐:
├─ 用完及时释放
├─ 只使用 PARTIAL_WAKE_LOCK(最小功耗)
└─ 避免在 UI 线程使用

❌ 避免:
├─ 长时间持有 WakeLock
├─ 使用 FULL_WAKE_LOCK(屏幕常亮)
└─ 忘记释放(导致电量持续消耗)

5. Doze 模式

5.1 Doze 模式

Doze 模式(空闲省电):
├─ 设备静止 + 屏幕关闭 → 进入 Doze
├─ 应用批量网络请求
├─ 延迟同步/定时任务
└─ 用户交互时退出 Doze

应用适配:
├─ 不要依赖精确的定时任务
├─ 使用 JobScheduler 提交后台任务
└─ 重要任务用 FCM/Wi-Fi Push

6. 面试高频考点

Q1: 电池优化策略?

回答:减少网络请求(批量/缓存)、优化定位策略(按需/低精度)、及时释放 WakeLock、利用 Doze 模式、合并后台任务。

Q2: 定位策略如何省电?

回答:根据场景选择定位精度(Battery Saving 优先)、低频定位(30s+)、按需定位(用完即停)。


🐱 小猫提示:电池优化记住 "减少网络、定位按需、WakeLock 及时释放、Doze 模式、合并后台任务"