理解 Stage 模型 —— HarmonyOS 应用架构新标准

理解 Stage 模型 —— HarmonyOS 应用架构新标准
在这里插入图片描述


个人主页:ujainu

文章目录

引言:为什么必须掌握 Stage 模型?

HarmonyOS 3.1 起,华为正式引入 Stage 模型,并宣布 FA(Feature Ability)模型逐步废弃。到 HarmonyOS 6.0.0(API 6.0.2) 时代,Stage 模型已成为唯一推荐的应用架构标准

如果你仍在使用 FA 模型,你的应用将:

  • ❌ 无法上架新版华为应用市场;
  • ❌ 无法使用最新 UI 能力(如 Canvas 高性能绘制、分布式窗口);
  • ❌ 失去对多设备协同、后台任务管理等高级特性的支持。

本文将带你从零彻底搞懂 Stage 模型,涵盖:

  • ✅ Stage vs FA 模型核心差异;
  • UIAbilityWindowStageContext 三大核心概念;
  • ✅ 项目结构文件(main_pages.json, module.json5)详解;
  • ✅ 如何获取屏幕尺寸、窗口、能力上下文;
  • ✅ 完整可运行代码示例(适配 API 6.0.2)。

所有内容均基于 DevEco Studio 4.1 + HarmonyOS 6.0.0 模拟器 实测验证。


一、Stage 模型 vs FA 模型:架构演进之路

1. FA 模型(已废弃)

FA(Feature Ability)模型是 HarmonyOS 早期采用的架构,灵感来自 Android 的 Activity/Service 模式。

// FA 模型示例(已不推荐)exportdefaultclassMainAbilityextendsAbility{onCreate(){// 初始化逻辑}}
FA 模型缺陷:能力(Ability)与 UI 强耦合;多窗口、多实例管理复杂;缺乏统一的生命周期管理;难以支持跨设备协同。

2. Stage 模型(现代标准)

Stage 模型采用 “能力(Ability) + 窗口(Window) + 页面(Page)”三层解耦架构,更符合现代操作系统设计理念。

维度FA 模型Stage 模型
入口MainAbilityUIAbility
UI 管理Ability 直接控制 UIWindowStage 管理窗口,Page 描述 UI
生命周期分散在 Ability 中统一由 UIAbilityWindowStage 协同管理
多实例支持困难原生支持(如分屏、悬浮窗)
跨设备协同需手动实现内置 Continuation 能力
💡 核心思想
UI 与业务逻辑分离,窗口与页面解耦,能力可复用

二、Stage 模型三大核心概念

1. UIAbility:应用的能力入口

UIAbility 是 Stage 模型中承载 UI 的能力单元,相当于 FA 模型中的 MainAbility,但职责更清晰。

// src/main/ets/UIAbility.tsimport UIAbility from'@ohos.app.ability.UIAbility';exportdefaultclassEntryAbilityextendsUIAbility{onCreate(want, launchParam){console.log('UIAbility created');}onWindowStageCreate(windowStage){// 关键:在此加载主页面 windowStage.loadContent('pages/Index',(err, data)=>{if(err.code){console.error('Failed to load content: '+JSON.stringify(err));return;}console.log('Content loaded successfully');});}onDestroy(){console.log('UIAbility destroyed');}}
代码逐行解析onCreate():Ability 创建时调用(适合初始化全局状态);onWindowStageCreate(windowStage)窗口创建完成,此时可加载页面;windowStage.loadContent('pages/Index'):指定主页面路径(相对于 src/main/ets);onDestroy():Ability 销毁前清理资源。
📌 关键点
UI 不再在 Ability 中定义,而是在独立的 Page 文件中描述(如 Index.ets)。

2. WindowStage:窗口管理中枢

WindowStage 代表一个应用窗口实例,负责:

  • 加载页面内容;
  • 管理窗口属性(大小、透明度、焦点);
  • 处理窗口生命周期事件。
// 在 UIAbility 中获取 WindowStageonWindowStageCreate(windowStage: window.WindowStage){// 获取窗口对象const window = windowStage.getMainWindowSync();// 设置窗口背景色 window.setWindowBackgroundColor('#FFFFFF');// 加载页面 windowStage.loadContent('pages/Index', callback);}
典型应用场景:全屏游戏:window.setFullScreen(true)悬浮窗:通过 windowManager 创建新 WindowStage多窗口协同:一个 Ability 可管理多个 WindowStage

3. Context:上下文获取桥梁

Context 是访问系统服务、资源、能力的统一入口。在 ArkTS 中,通过 getContext(this) 获取。

// 在 Page 组件中获取 Context@Entry@Component struct MyPage {build(){Column(){Button("获取屏幕信息").onClick(()=>{const context =getContext(this);const config = context.config;// 屏幕配置const ability = context.getUIAbility();// 获取 UIAbility 实例console.log(`Screen: ${config?.screenWidth} x ${config?.screenHeight}`);})}}}
关键 APIgetContext(this):在 @Component 中获取上下文;context.config:获取设备配置(屏幕宽高、DPI、语言等);context.getUIAbility():获取当前 UIAbility 实例;context.resourceManager:访问字符串、图片等资源。
⚠️ 注意
getContext(this) 中的 this 必须是 @Component 装饰的 struct 实例,否则会报错。

三、项目结构文件详解(Stage 模型专属)

Stage 模型引入了新的配置文件体系,取代 FA 模型的 config.json

1. main_pages.json:页面路由清单

路径src/main/resources/base/profile/main_pages.json
{"src":["pages/Index","pages/Detail"]}
作用:声明所有可被 loadContent() 加载的页面路径;路径相对于 src/main/ets必须显式注册,否则 loadContent 会失败。
💡 最佳实践:主页面放第一个;按功能模块组织路径(如 pages/game/Level1)。

2. module.json5:模块级配置(核心!)

路径src/main/module.json5
{ "module": { "name": "entry", "type": "entry", "description": "$string:module_desc", "mainElement": "EntryAbility", // 对应 UIAbility 类名 "deviceTypes": [ "phone", "tablet" ], "deliveryWithInstall": true, "installationFree": false, "pages": "$profile:main_pages", // 引用 main_pages.json "abilities": [ { "name": "EntryAbility", "srcEntry": "./ets/UIAbility.ts", // Ability 入口文件 "description": "$string:EntryAbility_desc", "icon": "$media:icon", "label": "$string:EntryAbility_label", "startWindowIcon": "$media:icon", "startWindowBackground": "$color:start_window_background", "exported": true, "skills": [ { "entities": ["entity.system.home"], "actions": ["action.system.home"] } ] } ] } } 
关键字段解析
📌 重要变化
FA 模型的 config.json 已被 module.json5 + main_pages.json 取代,配置更模块化、可读性更强

3. build-profile.json5:构建配置

路径:项目根目录 /build-profile.json5
{ "app": { "signingConfigs": [], "products": [ { "name": "default", "signingConfig": "default", "compatibleSdkVersion": "6.0.2(22)", // 关键:指定 API 版本 "runtimeOnly": false } ] } } 
作用:指定兼容的 SDK 版本(compatibleSdkVersion);配置签名、产品变体;控制是否仅运行时(runtimeOnly)。
适配提示
你的虚拟机为 API 6.0.2(22),此处必须匹配,否则安装失败。

四、实战:获取屏幕尺寸、窗口、能力上下文

场景:在页面中动态获取屏幕宽高并调整 UI

// 导入正确的模块和类型(适配 API 6.0.2)import window from'@ohos.window';import common from'@ohos.app.ability.common';@Entry@Component struct ScreenInfoPage {@State screenWidth:number=0;@State screenHeight:number=0;@State windowMode:string='API 6 不支持获取';aboutToAppear():void{// 延迟执行,确保窗口已创建setTimeout(()=>{this.updateScreenInfo();},300);}updateScreenInfo():void{try{// 1. 获取并转换 Context 类型const context =getContext(this)as common.UIAbilityContext;if(!context){console.error('获取 Context 失败');return;}// 2. 通过 windowStage 获取主窗口尺寸(API 6 兼容方式)const windowStage = context.windowStage;if(windowStage){const mainWindow = windowStage.getMainWindowSync();const windowProperties = mainWindow.getWindowProperties();this.screenWidth = windowProperties.windowRect.width;this.screenHeight = windowProperties.windowRect.height;}// 3. 打印 Ability 信息if(context.abilityInfo){console.log('UIAbility name:', context.abilityInfo.name);}// 4. 窗口模式获取在 API 6 中不可用,直接设置提示this.windowMode ='API 6 不支持获取';}catch(e){console.error('更新屏幕信息失败:',JSON.stringify(e));}}build(){Column(){Column(){Text(`屏幕尺寸:${this.screenWidth} x ${this.screenHeight}`).fontSize(18)Text(`窗口模式:${this.windowMode}`).fontSize(16).margin({ top:10})Button("刷新信息").onClick(()=>this.updateScreenInfo()).margin({ top:20})}.justifyContent(FlexAlign.Center)}.width('100%').height('100%').backgroundColor('#f0f0f0')}}
在这里插入图片描述
代码深度解析getContext(this):在 @Component 中安全获取上下文;context.config:直接读取屏幕宽高(单位:px),无需异步context.getUIAbility():获取 UIAbility 实例,用于访问生命周期或窗口;currentWindowStage.getMainWindowSync():同步获取主窗口(Stage 模型特有);getWindowMode():判断当前窗口模式(全屏/悬浮等)。
优势
所有操作均为同步调用,无回调地狱,代码简洁可靠。

五、常见问题与最佳实践

❓ Q1:如何在非 UIAbility 中获取 Context?

A:通过 Ability 的 context 属性传递,或使用 ApplicationContext(需权限)。

❓ Q2:main_pages.json 能否动态修改?

A:不能。所有页面必须在编译时注册,这是出于安全与性能考虑。

✅ 最佳实践:

  • Ability 职责单一:一个 UIAbility 只负责一类功能(如主界面、设置页);
  • 避免在 Page 中持有 Ability 引用:通过事件通信,而非直接调用;
  • 窗口操作放 Ability 中:Page 只负责 UI 描述,窗口管理归 UIAbility

六、总结:Stage 模型的核心价值

维度价值
架构清晰Ability(能力) + Window(窗口) + Page(页面)三层解耦
生命周期可控统一入口,便于资源管理与内存优化
多设备友好原生支持手机、平板、车机、手表的窗口适配
未来-proof华为官方唯一维护的模型,持续获得新特性
🚀 行动建议:新项目必须使用 Stage 模型;老 FA 项目尽快迁移(华为提供迁移工具);深入理解 UIAbilityWindowStage 的协作机制。

Read more

OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手

OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手

OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手 OpenClaw 是一款开源的本地 AI 助手,支持在你自己的服务器上部署,通过钉钉、飞书、WhatsApp、Telegram 等聊天工具交互。与云端 SaaS 服务不同,OpenClaw 让你完全掌控数据隐私,可以执行系统命令、浏览网页、管理文件,甚至编写代码。本教程将手把手教你在 Linux 系统下安装 OpenClaw 并对接钉钉机器人,打造专属的智能助理。 注意:本教程在 Linux 系统下进行 如果你使用飞书 可以看 保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手 OpenClaw 是什么? OpenClaw(原名

By Ne0inhk
从0到1快速学会Linux操作系统(基础),这一篇就够了!

从0到1快速学会Linux操作系统(基础),这一篇就够了!

目录在左侧或者右侧,可以根据需求点击快速跳转对应章节进行学习。 一、认识Linux 1.1什么是操作系统? 软件的一种,用户和计算机硬件之间的桥梁。 操作系统是计算机软件的一种,它主要负责: 作为用户和计算机硬件之间的桥梁,调度和管理计算机硬件进行工作。 而计算机,如果没有操作系统,就是一堆无法使用的垃圾而已。 用户控制操作系统,操作系统安排硬件干活。不管是PC操作系统还是移动操作系统其功能都是:调度硬件进行工作,充当用户和硬件之间的桥梁。 1.2 什么是linux?保护模式下的操作系统 创始人 : 林纳斯 托瓦兹,Linux 诞生于 1991 年,作者上大学期间。因为创始人在上大学期间经常需要浏览新闻和处理邮件,发现现有的操作系统不好用 , 于是他决心自己写一个保护模式下的操作系统,这就是 Linux 的原型, 当时他 21 岁,后来经过全世界网友的支持 , 现在能够兼容多种硬件,成为最为流行的服务器操作系统之一。 1.3 什么是Linux内核?毛坯房 内核是 Linux

By Ne0inhk

2026年03月19日全球AI前沿动态

一句话总结:2026年3月18日的AI相关资讯覆盖全球科技企业在大模型、专项技术、AI框架的多重突破,智能体与AI应用在多场景规模化落地,物理AI/机器人、硬件基础设施持续升级,企业迎来架构调整与产品密集更新,投融资向AI核心赛道倾斜,行业同时面临安全、通胀等挑战,学习研究资源不断丰富,AI正从技术探索向千行百业规模化落地迈进,人机协同成为主流发展模式。 一、模型与技术突破 1.1 通用大模型(大语言模型与多模态模型) * OpenAI:发布GPT-5.4系列模型,旗舰版为首个原生大一统模型,融合推理、编程等能力,日处理5万亿token,年化增收10亿美元,ARC基准测试准确率90%,44种工作岗位83%概率胜人类;GPT-5.4 mini性能逼近旗舰版,运行速度翻倍,优化编码与多模态能力,集成至GitHub Copilot,nano为轻量化版本,二者API价格最高涨4倍。 * MiniMax:发布M2.7模型,为首个深度参与自我迭代的国产大模型,具备自主构建能力,可独立完成复杂生产力任务,提升逻辑推理和工具调用精度。 * 智谱:发布GLM-5-Turbo,

By Ne0inhk
OpenClaw 搭建全流程实战:从 0 部署到可控 AI Agent(附避坑与安全建议)

OpenClaw 搭建全流程实战:从 0 部署到可控 AI Agent(附避坑与安全建议)

近几个月,「AI Agent」成为技术圈的高频词,但大多数人停留在 Demo、插件和概念层。 真正能跑在本地 / 服务器、拥有真实权限、能持续执行任务的 Agent 并不多。 OpenClaw,正是目前少数几个工程完整、可部署、可二次开发的开源 AI Agent 框架之一。 这篇文章不讲愿景、不画饼,只讲怎么搭、怎么跑、怎么不翻车。 一、OpenClaw 到底是什么?先说清楚定位 一句话说明白: OpenClaw 是一个可部署在本地或服务器上的开源 AI Agent 框架,具备 Gateway(通信)、Dashboard(控制台)和 Skills(能力插件)三大核心模块。 和 ChatGPT / 插件的本质区别在于: 对比项普通 AI 工具OpenClaw运行位置云端本地

By Ne0inhk