引言

电源管理是移动操作系统的基石能力。从用户开启"省电模式"延长续航,到游戏手机切换到"性能模式"释放全部算力,背后都是系统电源策略在发挥作用。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 模块的核心用法:

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

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

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

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

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

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


Logo

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

更多推荐