HarmonyOS 鸿蒙Next中如何检测设备是否处于“性能模式”或“省电模式”?

HarmonyOS 鸿蒙Next中如何检测设备是否处于“性能模式”或“省电模式”? 游戏类 App 希望在省电模式下降低帧率以避免卡顿,需实时感知系统电源策略,应该如何检测 HarmonyOS 5 设备是否处于“性能模式”或“省电模式”?

9 回复

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;
  }
}

三、关键注意事项(游戏场景优化)

  1. 调用时机
    • 游戏启动时(aboutToAppear):获取当前模式并初始化帧率;
    • 游戏运行中:通过监听实时调整;
    • 游戏暂停 / 恢复时:重新检测模式(避免后台切换模式后未响应)。
  2. 性能优化
    • 监听回调中仅处理帧率调整,避免复杂计算;
    • 帧率切换时添加平滑过渡(如从 60 帧渐变到 30 帧,避免画面卡顿)。
  3. 用户体验
    • 省电模式下降低帧率时,通过 Toast 提示用户(如 “省电模式已启用,帧率优化为 30fps”);
    • 支持用户手动关闭 “省电模式帧率限制”(在游戏设置中添加开关)。
  4. 模式枚举值说明
    • 切勿硬编码数字(如0代表省电模式),直接使用PowerMode枚举(代码可读性更高,避免 API 变更导致异常)。

四、总结

  1. HarmonyOS 5(API 20+)推荐使用PowerManager原生 API,支持同步获取电源模式 + 实时监听变化,无需权限,调用高效;
  2. 游戏 App 可根据模式动态调整帧率:省电模式降帧(30fps)、普通模式默认帧(60fps)、性能模式满帧(90fps);
  3. 低版本兼容可通过 API 版本判断 + 系统属性兜底,确保全场景覆盖。

在 HarmonyOS 5 中,检测设备的系统电源模式(如性能模式、省电模式)主要通过 @kit.BasicServicesKit 中的 power 模块来实现。

核心 API

  1. 模块 : import { power } from ‘@kit.BasicServicesKit’;
  2. 方法 : power.getPowerMode()
  3. 返回值 : power.DevicePowerMode 枚举

cke_3935.png

实现代码:

import { power } from '[@kit](/user/kit).BasicServicesKit';
import { BusinessError } from '[@kit](/user/kit).BasicServicesKit';

export class PowerModeUtil {
  /**
   * 获取当前电源模式
   * @returns 模式描述字符串或枚举值
   */
  public static async checkPowerMode(): Promise<string> {
    try {
      // 这是一个异步方法,需要 await
      const mode = await power.getPowerMode();

      switch (mode) {
        case power.DevicePowerMode.MODE_NORMAL:
          return "正常模式 (Normal)";
        case power.DevicePowerMode.MODE_POWER_SAVE:
          return "省电模式 (Power Save)";
        case power.DevicePowerMode.MODE_PERFORMANCE:
          return "性能模式 (Performance)";
        case power.DevicePowerMode.MODE_EXTREME_POWER_SAVE:
          return "超级省电模式 (Extreme Power Save)";
        default:
          return "未知模式";
      }
    } catch (err) {
      let error = err as BusinessError;
      console.error(`获取电源模式失败: code=${error.code}, message=${error.message}`);
      return "检测失败";
    }
  }

  /**
   * 判断是否处于省电模式(包括普通省电和超级省电)
   */
  public static async isPowerSaveMode(): Promise<boolean> {
    try {
      const mode = await power.getPowerMode();
      return mode === power.DevicePowerMode.MODE_POWER_SAVE || 
             mode === power.DevicePowerMode.MODE_EXTREME_POWER_SAVE;
    } catch (e) {
      return false;
    }
  }
}

@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 调度;

在HarmonyOS Next中,可以通过power模块的PowerMode接口检测设备性能模式。使用power.getPowerMode()方法获取当前模式,返回值为PowerMode枚举类型,包括NORMAL(普通模式)、POWER_SAVE(省电模式)和PERFORMANCE(性能模式)。示例代码:let mode = power.getPowerMode(); 根据返回值判断具体模式。

在HarmonyOS Next中,可以通过power模块的getPowerMode()方法来获取当前的电源模式。具体步骤如下:

  1. 导入模块

    import power from '[@ohos](/user/ohos).power';
    
  2. 获取电源模式

    let powerMode = power.getPowerMode();
    
  3. 判断模式类型powerMode 返回值为 PowerMode 枚举类型,包含:

    • power.PowerMode.NORMAL_MODE(正常模式)
    • power.PowerMode.PERFORMANCE_MODE(性能模式)
    • power.PowerMode.POWER_SAVE_MODE(省电模式)
  4. 实时监听模式变化(可选): 通过注册 '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 开始支持,需确保设备系统版本兼容。
回到顶部