HarmonyOS 鸿蒙Next中如何检测设备是否处于“性能模式”或“省电模式”?
HarmonyOS 鸿蒙Next中如何检测设备是否处于“性能模式”或“省电模式”? 游戏类 App 希望在省电模式下降低帧率以避免卡顿,需实时感知系统电源策略,应该如何检测 HarmonyOS 5 设备是否处于“性能模式”或“省电模式”?
power.getPowerMode
getPowerMode(): DevicePowerMode
获取当前设备的电源模式。
系统能力: SystemCapability.PowerManager.PowerManager.Core
返回值:
| 类型 | 说明 |
|---|---|
| DevicePowerMode | 电源模式。 |
错误码:
以下错误码的详细介绍请参见系统电源管理错误码。
| 错误码ID | 错误信息 |
|---|---|
| 4900101 | Failed to connect to the service. |
DevicePowerMode
表示电源模式的枚举值。
系统能力: SystemCapability.PowerManager.PowerManager.Core
| 名称 | 值 | 说明 |
|---|---|---|
| MODE_NORMAL | 600 | 表示标准模式,默认值。 |
| MODE_POWER_SAVE | 601 | 表示省电模式。 |
| MODE_PERFORMANCE | 602 | 表示性能模式。 |
| MODE_EXTREME_POWER_SAVE | 603 | 表示超级省电模式。 |
| MODE_CUSTOM_POWER_SAVE | 650 | 表示自定义省电模式。 |
更多关于HarmonyOS 鸿蒙Next中如何检测设备是否处于“性能模式”或“省电模式”?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
搜索分析了一下,代码还没有实测,可以参考一下:
游戏类 App 需通过检测系统电源模式动态调整帧率,避免省电模式下卡顿,HarmonyOS 5(API 20+)提供了原生 PowerManager API,支持实时获取电源模式(省电 / 普通 / 性能)及监听模式变化,以下是完整落地方案:
一、核心 API 说明(HarmonyOS 5 专属,API 20+)
| API / 枚举 | 功能描述 | 关键值 |
|---|---|---|
power.getPowerManager() |
获取电源管理实例 | - |
powerManager.getPowerMode() |
获取当前电源模式(同步返回) | 枚举PowerMode |
powerManager.on('powerModeChange') |
监听电源模式变化(实时响应) | 回调返回新的PowerMode |
PowerMode.POWER_MODE_SAVE |
省电模式(核心检测目标) | 0 |
PowerMode.POWER_MODE_NORMAL |
普通模式 | 1 |
PowerMode.POWER_MODE_PERFORMANCE |
性能模式 | 2 |
权限说明
无需额外申请权限!HarmonyOS 5 中获取 / 监听电源模式属于 “系统状态查询”,默认开放给应用,无需在module.json5中声明权限。
二、完整实现代码(ArkTS,Stage 模型)
1. 基础检测:获取当前电源模式
import power from '@ohos.power';
import { PowerMode } from '@ohos.power';
import promptAction from '@ohos.promptAction';
// 获取当前电源模式(同步调用,无延迟)
function getCurrentPowerMode(): PowerMode {
try {
const powerManager = power.getPowerManager();
const currentMode = powerManager.getPowerMode();
console.log("当前电源模式:", currentMode);
return currentMode;
} catch (e) {
console.error("获取电源模式失败:", e);
return PowerMode.POWER_MODE_NORMAL; // 异常时默认普通模式
}
}
// 游戏帧率调整逻辑(核心业务)
function adjustGameFpsByPowerMode() {
const currentMode = getCurrentPowerMode();
switch (currentMode) {
case PowerMode.POWER_MODE_SAVE:
// 省电模式:降低帧率(如从60帧降至30帧)
setGameFps(30);
promptAction.showToast({ message: "当前为省电模式,已降低帧率以节省电量" });
break;
case PowerMode.POWER_MODE_PERFORMANCE:
// 性能模式:提升帧率(如拉满90帧)
setGameFps(90);
break;
case PowerMode.POWER_MODE_NORMAL:
// 普通模式:默认帧率(如60帧)
setGameFps(60);
break;
}
}
// 模拟:设置游戏帧率(实际需调用游戏引擎API)
function setGameFps(fps: number) {
console.log("游戏帧率调整为:", fps + "fps");
// 示例:若使用鸿蒙原生3D引擎或第三方游戏引擎,调用对应帧率设置接口
// gameEngine.setFrameRate(fps);
}
2. 实时监听:电源模式变化时自动调整帧率
游戏运行中用户可能切换电源模式(如从普通模式切到省电模式),需监听变化并实时调整:
import power from '@ohos.power';
import { PowerMode } from '@ohos.power';
// 监听电源模式变化(游戏启动时调用,退出时取消监听)
function startPowerModeListener() {
try {
const powerManager = power.getPowerManager();
// 注册监听回调
powerManager.on('powerModeChange', (newMode: PowerMode) => {
console.log("电源模式变化:", newMode);
// 模式变化时重新调整帧率
adjustGameFpsByPowerMode();
});
console.log("电源模式监听启动成功");
} catch (e) {
console.error("启动电源模式监听失败:", e);
}
}
// 取消监听(游戏退出时调用,避免内存泄漏)
function stopPowerModeListener() {
try {
const powerManager = power.getPowerManager();
powerManager.off('powerModeChange');
console.log("电源模式监听已取消");
} catch (e) {
console.error("取消电源模式监听失败:", e);
}
}
// 游戏页面生命周期关联
@Entry
@Component
struct GamePage {
aboutToAppear() {
// 页面加载(游戏启动):获取当前模式+启动监听
adjustGameFpsByPowerMode();
startPowerModeListener();
}
aboutToDisappear() {
// 页面销毁(游戏退出):取消监听
stopPowerModeListener();
}
build() {
// 游戏渲染区域
Column() {
Text("游戏运行中...")
.fontSize(18)
}
.width('100%')
.height('100%')
}
}
3. 兼容处理(适配低版本鸿蒙设备)
若游戏需兼容 HarmonyOS 5 以下版本(API < 20),可添加版本判断兜底:
import abilityAccessCtrl from '@ohos.abilityAccessCtrl';
import bundleManager from '@ohos.bundle.bundleManager';
// 检测当前鸿蒙系统API版本
async function getSystemApiVersion(): Promise<number> {
const bundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_VERSION);
return bundleInfo.versionCode; // 返回API版本号(如20对应HarmonyOS 5)
}
// 兼容版:获取电源模式
async function getCurrentPowerModeCompatible() {
const apiVersion = await getSystemApiVersion();
if (apiVersion >= 20) {
// HarmonyOS 5+:使用原生API
return getCurrentPowerMode();
} else {
// 低版本:通过系统属性兜底(仅支持判断省电模式)
const isPowerSaveMode = await checkLowVersionPowerSaveMode();
return isPowerSaveMode ? PowerMode.POWER_MODE_SAVE : PowerMode.POWER_MODE_NORMAL;
}
}
// 低版本鸿蒙:判断是否为省电模式(通过系统属性)
async function checkLowVersionPowerSaveMode(): Promise<boolean> {
try {
const powerManager = power.getPowerManager();
// 低版本API:getPowerSaveMode() 返回布尔值
return powerManager.getPowerSaveMode();
} catch (e) {
return false;
}
}
三、关键注意事项(游戏场景优化)
- 调用时机:
- 游戏启动时(
aboutToAppear):获取当前模式并初始化帧率; - 游戏运行中:通过监听实时调整;
- 游戏暂停 / 恢复时:重新检测模式(避免后台切换模式后未响应)。
- 游戏启动时(
- 性能优化:
- 监听回调中仅处理帧率调整,避免复杂计算;
- 帧率切换时添加平滑过渡(如从 60 帧渐变到 30 帧,避免画面卡顿)。
- 用户体验:
- 省电模式下降低帧率时,通过 Toast 提示用户(如 “省电模式已启用,帧率优化为 30fps”);
- 支持用户手动关闭 “省电模式帧率限制”(在游戏设置中添加开关)。
- 模式枚举值说明:
- 切勿硬编码数字(如
0代表省电模式),直接使用PowerMode枚举(代码可读性更高,避免 API 变更导致异常)。
- 切勿硬编码数字(如
四、总结
- HarmonyOS 5(API 20+)推荐使用
PowerManager原生 API,支持同步获取电源模式 + 实时监听变化,无需权限,调用高效; - 游戏 App 可根据模式动态调整帧率:省电模式降帧(30fps)、普通模式默认帧(60fps)、性能模式满帧(90fps);
- 低版本兼容可通过 API 版本判断 + 系统属性兜底,确保全场景覆盖。
@ohos.power (系统电源管理)
调用 @ohos.power 的 getPowerMode() 即可实时检测 HarmonyOS 5 设备是否处于性能模式或省电模式
可通过 @ohos.power 获取电源模式:
import power from '@ohos.power';
const mode = power.getPowerMode(); // 返回 PowerMode.NORMAL / POWER_SAVE / PERFORMANCE
POWER_SAVE:省电模式,CPU 频率受限,后台活动被冻结;PERFORMANCE:性能模式(部分机型支持),提升 GPU/CPU 调度;
根据官网参考下,使用API getPowerMode:
在HarmonyOS Next中,可以通过power模块的getPowerMode()方法来获取当前的电源模式。具体步骤如下:
-
导入模块:
import power from '[@ohos](/user/ohos).power'; -
获取电源模式:
let powerMode = power.getPowerMode(); -
判断模式类型:
powerMode返回值为PowerMode枚举类型,包含:power.PowerMode.NORMAL_MODE(正常模式)power.PowerMode.PERFORMANCE_MODE(性能模式)power.PowerMode.POWER_SAVE_MODE(省电模式)
-
实时监听模式变化(可选): 通过注册
'powerModeChange'事件监听电源模式切换:power.on('powerModeChange', (mode) => { console.log(`Current power mode: ${mode}`); // 根据模式调整帧率等逻辑 });
示例代码:
import power from '[@ohos](/user/ohos).power';
// 获取当前模式
let currentMode = power.getPowerMode();
if (currentMode === power.PowerMode.POWER_SAVE_MODE) {
// 省电模式下执行降帧率等操作
adjustFrameRate(true);
} else if (currentMode === power.PowerMode.PERFORMANCE_MODE) {
// 性能模式下恢复高帧率
adjustFrameRate(false);
}
// 监听模式变化
power.on('powerModeChange', (mode) => {
if (mode === power.PowerMode.POWER_SAVE_MODE) {
adjustFrameRate(true);
} else {
adjustFrameRate(false);
}
});
注意事项:
- 需要申请
ohos.permission.POWER_MANAGER权限(在module.json5中配置)。 - 此 API 从 API Version 10 开始支持,需确保设备系统版本兼容。



