HarmonyOS NEXT 电源管理详解:@ohos.power 设备模式与状态监测实战
引言
电源管理是移动操作系统的基石能力。从用户开启"省电模式"延长续航,到游戏手机切换到"性能模式"释放全部算力,背后都是系统电源策略在发挥作用。HarmonyOS NEXT 通过 @ohos.power 模块向应用层暴露了电源状态查询能力,让开发者能够感知设备的电源模式、屏幕状态和待机情况。
本文是"设备状态感知"系列的第三篇——前两篇分别介绍了电池健康(@ohos.batteryInfo)和温控管理(@ohos.thermal),本篇聚焦电源模式(@ohos.power)。三个模块共同构成了设备状态感知的基础能力矩阵:
设备状态铁三角
├── @ohos.batteryInfo → 电池"是什么状态"(电量/健康/温度)
├── @ohos.thermal → 系统"该怎么做"(温控等级/降级策略)
└── @ohos.power → 用户"选择了什么"(电源模式/省电策略)
本文将创建一个"电源管理实验室"Demo,深入讲解 @ohos.power 的三个核心 API 和五种电源模式。
@ohos.power 模块概述
@ohos.power 是 HarmonyOS NEXT 提供的电源管理模块,位于 @kit.BasicServicesKit。它的定位非常清晰:提供设备电源状态和模式的同步查询能力。
导入方式
import power from '@ohos.power';
API 总览
| API | 返回值 | 类型 | 说明 |
|---|---|---|---|
isActive() |
boolean |
同步 | 检测设备是否活跃(屏幕是否亮起) |
isStandby() |
boolean |
同步 | 检测设备是否处于待机模式(API 10+) |
getPowerMode() |
DevicePowerMode |
同步 | 获取当前电源模式 |
isScreenOn() |
Promise<boolean> |
异步 | 【已废弃】检测屏幕状态,建议用 isActive |
rebootDevice() |
void |
同步 | 【已废弃】重启设备,需 ohos.permission.REBOOT |
关键特性:与 @ohos.batteryInfo 一样,核心 API 全部同步返回。这是系统状态查询类 API 的典型设计——对于瞬息万变的设备状态,同步查询避免了异步调度的延迟。
DevicePowerMode 枚举
这是 @ohos.power 最核心的类型,定义了设备支持的电源模式:
| 枚举值 | 数值 | 含义 | 典型场景 |
|---|---|---|---|
MODE_NORMAL |
600 | 标准模式 | 日常使用——所有功能正常 |
MODE_POWER_SAVE |
601 | 省电模式 | 电量较低——后台受限、亮度降低 |
MODE_PERFORMANCE |
602 | 性能模式 | 游戏/渲染——CPU/GPU 满频 |
MODE_EXTREME_POWER_SAVE |
603 | 超级省电 | 电量告急——仅核心功能 |
MODE_CUSTOM_POWER_SAVE |
650 | 自定义省电 | API 20+ — 用户自定义策略 |
枚举值为何从 600 开始? 这是 HarmonyOS 的设计惯例——给枚举值分配较大的间隔数值,便于未来在中间插入新模式而不打乱编号。例如,如果将来需要"轻度省电"模式,可能会分配 604~649 之间的值。
核心 API 详解
1. isActive() — 屏幕活跃状态
function isActive(): boolean;
这是最常用的电源 API。它同步返回设备是否处于"活跃"状态——即屏幕是否亮起、用户是否正在与设备交互。
与 Android 的对比:Android 需要通过 PowerManager.isInteractive() 或监听 Intent.ACTION_SCREEN_ON/OFF 广播才能获取屏幕状态。HarmonyOS 的 isActive() 比 Android 的广播机制更简单直接——一行同步代码即可。
if (power.isActive()) {
// 屏幕亮着,可以播放动画
this.startAnimation();
} else {
// 屏幕已熄,暂停非必要渲染
this.pauseRendering();
}
注意事项:
isActive()返回true表示屏幕亮且用户可交互- 屏幕亮但锁屏状态下也返回
true(屏幕确实亮着) - 此 API 替代了已废弃的
isScreenOn(),后者需要回调或 Promise
2. isStandby() — 待机模式检测
function isStandby(): boolean;
isStandby() 是 API 10 新增的方法,用于检测设备是否进入待机(idle)模式。待机模式与息屏不同:
- 息屏:屏幕熄灭但 CPU 仍在运行,应用可以继续后台任务
- 待机:设备进入深度空闲状态,网络可能受限,后台任务被严格管控
if (power.isStandby()) {
// 设备在待机,推迟非紧急网络请求
this.deferNetworkRequests();
} else {
// 设备活跃,正常执行
this.scheduleBackgroundSync();
}
实际意义:isStandby() 对于后台任务调度非常有用。当设备进入待机,你的后台同步、数据预取等操作应该推迟,因为系统可能随时断开网络来省电。
3. getPowerMode() — 电源模式查询
function getPowerMode(): DevicePowerMode;
这是最能体现"用户意图"的 API。电源模式反映了用户或系统对设备性能与续航之间权衡的选择:
const mode: power.DevicePowerMode = power.getPowerMode();
if (mode === power.DevicePowerMode.MODE_PERFORMANCE) {
// 性能模式 → 画质拉满
this.setGraphicsQuality('ULTRA');
} else if (mode === power.DevicePowerMode.MODE_POWER_SAVE ||
mode === power.DevicePowerMode.MODE_EXTREME_POWER_SAVE) {
// 省电模式 → 自动降画质
this.setGraphicsQuality('LOW');
} else {
// 标准模式 → 默认画质
this.setGraphicsQuality('MEDIUM');
}
五种模式的行为差异:
| 行为 | 标准 | 省电 | 性能 | 超级省电 | 自定义 |
|---|---|---|---|---|---|
| CPU 频率 | 正常 | 受限 | 满频 | 最低 | 用户定 |
| GPU 频率 | 正常 | 受限 | 满频 | 最低 | 用户定 |
| 后台活动 | 正常 | 受限 | 正常 | 几乎禁止 | 用户定 |
| 屏幕亮度 | 自适应 | 降低 | 最高 | 最低 | 用户定 |
| 振动反馈 | 正常 | 减少 | 正常 | 关闭 | 用户定 |
| 网络同步 | 正常 | 延迟 | 正常 | 暂停 | 用户定 |
4. shutdown() 和 reboot() — 需要系统权限
function shutdown(reason: string): void; // 需要 ohos.permission.REBOOT
function reboot(reason: string): void; // 需要 ohos.permission.REBOOT
这两个方法需要 ohos.permission.REBOOT 权限,属于系统级权限,普通应用无法获取。Demo 页面不涉及这两个 API,但它们体现了 @ohos.power 模块的完整能力——从状态感知到行为控制。
实战:电源管理实验室
页面结构设计
┌─────────────────────────────────┐
│ < 电源管理实验室 @ohos.power │ ← 标题栏(#6366F1 靛蓝)
├─────────────────────────────────┤
│ 当前电源模式 │
│ ┌─────────────────────────┐ │
│ │ ┌──┐ │ │ ← 模式图标 + 名称 + 详细描述
│ │ │⚡│ 性能模式 │ │
│ │ └──┘ CPU/GPU 满频运行... │ │
│ └─────────────────────────┘ │
├─────────────────────────────────┤
│ 设备运行状态 │
│ ┌──────────┐ ┌──────────┐ │ ← 双栏面板
│ │ ● 亮屏 │ │ ● 活跃 │ │ 绿=亮屏/活跃
│ │ 屏幕亮起 │ │ 未待机 │ │ 红=息屏/待机
│ └──────────┘ └──────────┘ │
├─────────────────────────────────┤
│ 电源模式一览 │
│ ┌─────────────────────────┐ │
│ │ ● 标准模式 ◀ 当前 NORMAL│ │ ← 5种模式对照表
│ │ ─────────────────────── │ │ 当前模式高亮标记
│ │ ○ 省电模式 POWER_SAVE│ │
│ │ ○ 性能模式 PERFORMANCE│ │
│ │ ○ 超级省电 EXTREME...│ │
│ │ ○ 自定义省电 CUSTOM │ │
│ └─────────────────────────┘ │
├─────────────────────────────────┤
│ [ 刷新电源状态 ] │
├─────────────────────────────────┤
│ 电源日志 │
└─────────────────────────────────┘
关键实现细节
模式比较:枚举值匹配
Demo 中最关键的设计是"当前模式高亮"机制。五种电源模式在列表中展示,当前激活的模式需要视觉突出:
private isModeActive(modeConst: number): boolean {
return this.powerMode === modeConst;
}
在 @Builder modeRow 中,根据 isModeActive 的结果动态切换颜色、字重和显示"◀ 当前"标记:
Text(label)
.fontSize(12)
.fontColor(this.isModeActive(modeConst) ? color : '#0F172A')
.fontWeight(this.isModeActive(modeConst) ? FontWeight.Bold : FontWeight.Normal)
if (this.isModeActive(modeConst)) {
Text(' ◀ 当前')
.fontSize(9).fontColor(color)
.fontWeight(FontWeight.Bold)
}
CUSTOM_POWER_SAVE 的特殊处理
MODE_CUSTOM_POWER_SAVE 的枚举值是 650(API 20 新增),而其他模式的枚举值在 600~603。由于它是较新的 API,在旧版本设备上 getPowerMode() 不会返回这个值。代码中需要硬编码数值进行比较:
if (mode === (650 as power.DevicePowerMode)) {
this.powerModeLabel = '自定义省电';
this.powerModeDesc = '用户自定义的省电策略...';
}
使用 650 as power.DevicePowerMode 而不是直接 650 是因为 ArkTS 严格模式不允许数字直接与枚举比较——尽管它们在运行时是同一个值。

实际应用场景
场景 1:根据电源模式自适应画质
游戏类应用最经典的需求——性能模式全特效,省电模式降画质:
private applyPowerBasedSettings(): void {
const mode: power.DevicePowerMode = power.getPowerMode();
switch (mode) {
case power.DevicePowerMode.MODE_PERFORMANCE:
this.setFrameRate(120);
this.setShadowQuality('HIGH');
this.setAntiAliasing('MSAA_4X');
break;
case power.DevicePowerMode.MODE_NORMAL:
this.setFrameRate(60);
this.setShadowQuality('MEDIUM');
this.setAntiAliasing('FXAA');
break;
case power.DevicePowerMode.MODE_POWER_SAVE:
this.setFrameRate(30);
this.setShadowQuality('LOW');
this.setAntiAliasing('OFF');
break;
case power.DevicePowerMode.MODE_EXTREME_POWER_SAVE:
this.setFrameRate(30);
this.setShadowQuality('OFF');
this.setAntiAliasing('OFF');
break;
}
}
场景 2:屏幕熄灭后暂停传感器采集
传感器密集型应用(如计步器、导航)应在屏幕熄灭后降低采样频率:
private adjustSensorSampling(): void {
if (power.isActive()) {
// 屏幕亮,正常频率
sensor.startSampling(100); // 100ms 间隔
} else {
// 屏幕熄,降低频率省电
sensor.startSampling(1000); // 1s 间隔
}
}
场景 3:待机模式下推迟后台同步
待机状态下系统会断开网络以省电,此时触发网络请求可能失败或唤醒设备:
private schedulePeriodicSync(): void {
if (power.isStandby()) {
// 待机中,推迟 30 分钟再试
this.rescheduleSync(30 * 60 * 1000);
} else {
// 非待机,立即同步
this.performSync();
}
}
完整代码
import { router } from '@kit.ArkUI';
import power from '@ohos.power';
import { FontSize, Spacing } from '../common/Constants';
interface EventLog {
time: string;
msg: string;
}
@Entry
@Component
struct PowerLabPage {
@State isScreenActive: boolean = false;
@State isStandby: boolean = false;
@State powerMode: number = -1;
@State powerModeLabel: string = '—';
@State powerModeDesc: string = '';
@State powerModeIcon: string = '';
@State eventLogs: EventLog[] = [];
@State loading: boolean = true;
aboutToAppear(): void {
this.loadPower();
}
private loadPower(): void {
this.addLog('开始读取电源状态...');
try {
this.isScreenActive = power.isActive();
this.isStandby = power.isStandby();
const mode: power.DevicePowerMode = power.getPowerMode();
this.powerMode = mode;
this.updateModeUI(mode);
this.addLog('屏幕状态: ' + (this.isScreenActive ? '亮屏' : '息屏'));
this.addLog('待机状态: ' + (this.isStandby ? '待机中' : '活跃'));
this.addLog('电源模式: ' + this.powerModeLabel);
this.loading = false;
} catch (e) {
this.loading = false;
this.addLog('读取电源信息失败');
}
}
private updateModeUI(mode: power.DevicePowerMode): void {
if (mode === power.DevicePowerMode.MODE_NORMAL) {
this.powerModeLabel = '标准模式';
this.powerModeDesc =
'CPU/GPU 满频运行,亮度自适应,所有服务正常运作。适合日常使用场景。';
this.powerModeIcon = '🔋';
} else if (mode === power.DevicePowerMode.MODE_POWER_SAVE) {
this.powerModeLabel = '省电模式';
this.powerModeDesc =
'限制后台活动,降低屏幕亮度,减少振动和动画效果。延长续航。';
this.powerModeIcon = '🪫';
} else if (mode === power.DevicePowerMode.MODE_PERFORMANCE) {
this.powerModeLabel = '性能模式';
this.powerModeDesc =
'CPU/GPU 超频运行,屏幕高刷新率,所有性能限制解除。适合游戏和专业应用。';
this.powerModeIcon = '⚡';
} else if (mode === power.DevicePowerMode.MODE_EXTREME_POWER_SAVE) {
this.powerModeLabel = '超级省电';
this.powerModeDesc =
'仅保留电话、短信等核心功能,关闭所有非必要服务。最大化续航。';
this.powerModeIcon = '🪫';
} else if (mode === (650 as power.DevicePowerMode)) {
this.powerModeLabel = '自定义省电';
this.powerModeDesc =
'用户自定义的省电策略,部分限制条件由用户自行选择配置。API 20+。';
this.powerModeIcon = '⚙️';
} else {
this.powerModeLabel = '未知模式';
this.powerModeDesc = '无法识别当前电源模式,可能为新版系统引入的模式。';
this.powerModeIcon = '❓';
}
}
private modeColor(): string {
if (this.powerMode === power.DevicePowerMode.MODE_NORMAL)
return '#10B981';
if (this.powerMode === power.DevicePowerMode.MODE_POWER_SAVE)
return '#F59E0B';
if (this.powerMode === power.DevicePowerMode.MODE_PERFORMANCE)
return '#EF4444';
if (this.powerMode === power.DevicePowerMode.MODE_EXTREME_POWER_SAVE)
return '#F97316';
if (this.powerMode === (650 as power.DevicePowerMode))
return '#6366F1';
return '#94A3B8';
}
// ... addLog、isModeActive、build 等方法参见项目源码
}
权限说明
| API | 所需权限 |
|---|---|
isActive() |
无需权限 |
isStandby() |
无需权限 |
getPowerMode() |
无需权限 |
shutdown() |
ohos.permission.REBOOT(系统权限) |
reboot() |
ohos.permission.REBOOT(系统权限) |
普通应用只能使用前三个查询 API,关机/重启需要系统签名权限,仅系统应用可用。
与前四篇的对比:模式识别
本文是"鸿蒙新特性"系列的第五篇。回顾前四篇,我们已经覆盖了 BasicServicesKit 中四个核心模块。它们共同组成的"设备状态感知矩阵"值得一览:
| 篇次 | 模块 | 感知维度 | 异步模式 | 典型场景 |
|---|---|---|---|---|
| #1 | @ohos.window | 窗口属性与方向 | Promise | 全屏/分屏适配 |
| #2 | @ohos.wifiManager | 网络连接状态 | Promise | 网络状态诊断 |
| #3 | @ohos.batteryInfo | 电池电量与健康 | 同步常量 | 电池健康监控 |
| #4 | @ohos.thermal | 设备温控等级 | 同步 + Callback | 热感知降级 |
| #5 | @ohos.power | 电源模式与状态 | 同步常量 | 模式自适应 |
前三篇分别覆盖了窗口(用户看到的)、网络(设备连接的)、电池(支撑这一切的),第四篇和本篇进一步延伸到了温度和电源策略——两个直接影响用户体验但常被忽视的维度。
总结
本文深入讲解了 HarmonyOS NEXT 中 @ohos.power 模块的核心用法:
-
三个同步 API:
isActive()、isStandby()、getPowerMode()——全是同步查询,零异步开销。 -
五种电源模式:从标准到超级省电,从性能到自定义,覆盖了设备功耗管理的全部策略。理解这些模式的差异,有助于在应用中做出更智能的资源调度决策。
-
屏幕感知编程:
isActive()是最基础也是最常用的 API——屏幕亮起时渲染,屏幕熄灭时休眠。这是移动应用性能优化的第一课。 -
待机意识:
isStandby()(API 10+)为后台任务调度提供了精细化的时机判断——在待机状态下推迟非紧急任务,既能省电又不影响用户体验。 -
设备状态铁三角:
batteryInfo(电池状态) +thermal(温控策略) +power(电源模式)构成了完整的设备感知链路,让应用能够做出从"被动响应"到"主动适应"的跨越。
掌握 @ohos.power,你的应用就能根据设备的电源状态做出智能调整——在性能模式下释放全部算力,在省电模式下优雅降级,在屏幕熄灭后安静休眠。这正是"用户友好型"应用应具备的品质。
更多推荐


所有评论(0)