引言

电源管理是移动操作系统的基石能力。从用户开启"省电模式"延长续航,到游戏手机切换到"性能模式"释放全部算力,背后都是系统电源策略在发挥作用。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_NORMAL600标准模式日常使用——所有功能正常
MODE_POWER_SAVE601省电模式电量较低——后台受限、亮度降低
MODE_PERFORMANCE602性能模式游戏/渲染——CPU/GPU 满频
MODE_EXTREME_POWER_SAVE603超级省电电量告急——仅核心功能
MODE_CUSTOM_POWER_SAVE650自定义省电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 模块的核心用法:

  1. 三个同步 APIisActive()isStandby()getPowerMode()——全是同步查询,零异步开销。

  2. 五种电源模式:从标准到超级省电,从性能到自定义,覆盖了设备功耗管理的全部策略。理解这些模式的差异,有助于在应用中做出更智能的资源调度决策。

  3. 屏幕感知编程isActive() 是最基础也是最常用的 API——屏幕亮起时渲染,屏幕熄灭时休眠。这是移动应用性能优化的第一课。

  4. 待机意识isStandby()(API 10+)为后台任务调度提供了精细化的时机判断——在待机状态下推迟非紧急任务,既能省电又不影响用户体验。

  5. 设备状态铁三角batteryInfo(电池状态) + thermal(温控策略) + power(电源模式)构成了完整的设备感知链路,让应用能够做出从"被动响应"到"主动适应"的跨越。

掌握 @ohos.power,你的应用就能根据设备的电源状态做出智能调整——在性能模式下释放全部算力,在省电模式下优雅降级,在屏幕熄灭后安静休眠。这正是"用户友好型"应用应具备的品质。


Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐