HarmonyOS中Stage模型详解

77 阅读4分钟

一、鸿蒙应用模型的演进

原生JS ---->JQuery---->MVVM的技术演变

  • 问题引入
    • “我们开发一个鸿蒙应用,代码的入口在哪里?”
    • “应用是如何被系统管理的?界面、数据、后台任务如何协同?”
    • “为什么现在官方文档和新项目都推荐使用Stage模型?”
  • 历史背景
    • FA (Feature Ability) 模型:鸿蒙早期(1.0/2.0)的应用模型,借鉴了Android的四大组件思想,概念相对复杂,组件间通信(IPC)开销较大。
    • Stage模型:从鸿蒙3.0开始主推的新一代应用模型。它借鉴了现代前端框架(如React/Vue)和微内核思想,核心是“Ability” + “WindowStage” + “Context” ,结构更清晰、性能更优、扩展性更强。
  • 核心结论
    • FA模型已逐步被弃用。新项目开发必须使用Stage模型
    • 本课程将聚焦于当前和未来的标准——Stage模型

二、 为什么选择Stage模型?

对比维度FA模型 (旧)Stage模型 (新/推荐)优势总结
设计理念以“功能组件”(Ability)为中心,强耦合以“应用阶段”(Stage)为中心,分层解耦解耦性高,职责更清晰。
组件通信大量依赖Want进行跨Ability通信,IPC开销大Ability内通过Context共享,跨Ability通信更高效性能更优,减少不必要的跨进程调用。
资源管理资源管理分散,配置复杂资源管理集中(resources目录),通过Resource类统一访问开发更便捷,维护性好。
生命周期Ability生命周期复杂,与UI耦合UIAbility生命周期清晰,WindowStage管理UI呈现逻辑更清晰,UI与业务逻辑分离更彻底。
扩展性扩展性受限,多窗口支持弱原生支持多窗口、自由流转、服务卡片等新特性面向未来,是鸿蒙分布式能力的基础。
开发体验配置繁琐,代码分散配置集中(module.json5),代码组织更现代化学习曲线更平滑,更符合现代开发习惯。

强调:选择Stage模型不是“可选项”,而是开发鸿蒙应用的唯一正确路径。它为应用的性能、可维护性和未来扩展性奠定了坚实基础。

三、 Stage模型核心组件深度解析

Stage模型的核心可以概括为一个公式:Application -> Ability -> WindowStage -> UI

(一) UIAbility:应用能力的基石

1. 定义:

UIAbility 是Stage模型中承载用户界面和交互逻辑的核心组件。一个应用可以有多个UIAbility(如主页面、设置页、分享页)。

2. 核心职责:

  • 生命周期管理:系统通过回调方法管理其状态。
    • onCreate(): Ability被创建时调用。关键点:在此处可以进行一些全局初始化(如数据准备、服务注册),但不要做耗时操作
    • onWindowStageCreate(windowStage: WindowStage): UI呈现的起点。当系统为该Ability创建好WindowStage后调用。核心任务:在此方法中通过windowStage.loadContent('pages/Index')加载指定的页面内容。
    • onWindowStageDestroy(): UI销毁时调用。进行资源释放。
    • onDestroy(): Ability被销毁时调用。进行最终的清理工作。
    • onForeground(): Ability转到前台时调用(如从后台切回)。
    • onBackground(): Ability转到后台时调用。

UIAbility首次启动生命周期示意图

UIAbility前后台切换时的生命周期执行流程

  • 数据与服务承载:可以持有应用数据、启动后台服务、管理数据库连接等。
  • 跨Ability通信:作为通信的端点。
  • 代码示例 (MainAbility.ts):
import UIAbility from '@ohos.app.ability.UIAbility';
import hilog from '@ohos.hilog';
import window from '@ohos.window';

const TAG: string = '[Example] MainAbility';

export default class MainAbility extends UIAbility {
  // 1. Ability创建
  onCreate(want, launchParam) {
    hilog.info(0x0000, TAG, 'onCreate');
    // 可以进行初始化,但避免耗时
  }

  // 2. WindowStage创建 - UI加载的关键
  onWindowStageCreate(windowStage: window.WindowStage) {
    hilog.info(0x0000, TAG, 'onWindowStageCreate');

    // 设置WindowStage的事件监听(可选)
    windowStage.on('windowStageFocus', () => {
      hilog.info(0x0000, TAG, 'WindowStage focused');
    });

    // 3. 加载页面内容 - 核心!
    windowStage.loadContent('pages/Index', (err, data) => {
      if (err.code) {
        hilog.error(0x0000, TAG, 'Failed to load the content, err: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, TAG, 'Succeeded in loading the content, data: %{public}s', JSON.stringify(data) ?? '');
    });
  }

  onWindowStageDestroy() {
    hilog.info(0x0000, TAG, 'onWindowStageDestroy');
    // UI销毁,释放UI相关资源
  }

  onDestroy() {
    hilog.info(0x0000, TAG, 'onDestroy');
    // Ability销毁,进行最终清理
  }

  onForeground() {
    hilog.info(0x0000, TAG, 'onForeground');
  }

  onBackground() {
    hilog.info(0x0000, TAG, 'onBackground');
  }
}

(二) Context:应用的“万能钥匙”

1. 定义:

  • Context 是应用或Ability的上下文环境,提供了访问应用资源、启动Ability、访问数据库、获取系统服务等能力的统一入口

2. 获取方式

    • UIAbility中:通过 this.context 获取。
    • 在页面(@Entry组件)中:通过 getContext(this) 获取。

3. 核心用途

    • 启动Abilitycontext.startAbility(want)
    • 访问资源context.resourceManager.getString($r('app.string.app_name').id)
    • 获取应用信息context.abilityInfo.bundleName, context.abilityInfo.name
    • 访问文件系统context.filesDir, context.cacheDir
    • 获取系统服务context.getResourceManager(), context.getApplicationInfo()

(三) 3. WindowStageWindow:UI的舞台

1. WindowStage (窗口阶段):

    • 代表一个UIAbility实例所关联的窗口集合
    • 它是UIAbility和具体UI窗口(Window)之间的桥梁。
    • onWindowStageCreateonWindowStageDestroy 是其生命周期的体现。
    • 核心方法:loadContent() - 加载ArkTS页面。

2. Window (窗口):

    • 代表屏幕上一个具体的UI窗口。一个WindowStage可以管理多个Window(实现多窗口)。
    • 负责窗口的创建、销毁、大小、位置、背景色、状态栏/导航栏控制等。
    • loadContent之后,可以通过windowStage.getMainWindow()获取主窗口进行更精细的控制。
  • 关系UIAbility -> 拥有 -> WindowStage -> 管理 -> 一个或多个 Window -> 呈现 -> UI内容。

(四) Resource (资源) 与 module.json5 (配置)

  • resources 目录:集中存放字符串(strings.json)、颜色(colors.json)、布局文件、图片等资源。通过$r('app.string.hello')等方式在代码中引用。
  • module.json5:应用的核心配置文件。定义了:
    • 应用/Ability的基本信息(name, description)。
    • 声明 UIAbility 及其类型(page)。
    • 声明所需权限 (reqPermissions)。
    • 声明后台运行模式 (backgroundModes)。
    • 应用图标、标签等。

四、 通过项目观察Stage模型应用

(一) 应用包结构

(二) 应用组件