Stage 模型改变的不是生命周期,而是系统边界


网罗开发 (小红书、快手、视频号同名)

大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验 。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员

👋 大家好,我是展菲!

📱 全网搜索"展菲",即可纵览我在各大平台的知识足迹。

📣 公众号"Swift社区",每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。

💬 微信端添加好友"fzhanfei",与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。

📅 最新动态:2025 年 3 月 17 日

快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!

文章目录

引言

很多开发者第一次接触鸿蒙 Stage 模型时,第一反应通常是:

"就是生命周期换了一套写法。"

比如:

  • Ability 生命周期变了
  • 页面生命周期变了
  • 启动流程不一样了

于是很多人把 Stage 模型理解为:

复制代码
旧模型(FA) → 新模型(Stage)
= 生命周期升级

但如果你深入做一个中大型项目,很快就会发现:

Stage 模型真正改变的,不是生命周期,而是系统边界。

一、为什么很多人误解了 Stage 模型

因为你最先接触到的,是这些代码:

ts 复制代码
export default class EntryAbility extends UIAbility {

  onCreate() {
    console.log("Ability 创建")
  }

  onDestroy() {
    console.log("Ability 销毁")
  }

}

或者页面:

ts 复制代码
aboutToAppear() {
  this.loadData()
}

这些都让人产生一种错觉:

Stage = 生命周期 API 的变化

但这只是"表层变化"。

二、旧模型(FA)的问题在哪里

在 FA(Feature Ability)模型中:

复制代码
Ability = 应用入口 + UI 容器 + 生命周期管理

也就是说:一个 Ability 既管 UI,又管逻辑,还管生命周期。

典型问题

1 职责混乱
ts 复制代码
// Ability 里既有 UI,又有业务逻辑
startAbility(...)
setUIContent(...)
loadData(...)

UI、业务、系统混在一起

2 边界不清晰
复制代码
页面属于 Ability
逻辑也属于 Ability

模块无法拆分

3 扩展性差

当你需要:

复制代码
多窗口
多实例
跨设备

非常困难

三、Stage 模型做了什么

Stage 模型最大的变化是:

重新划分了"系统边界"。

核心拆分

复制代码
UIAbility(应用级)
   ↓
WindowStage(窗口级)
   ↓
Page(页面级)

示例代码

ts 复制代码
export default class EntryAbility extends UIAbility {

  onWindowStageCreate(windowStage) {
    windowStage.loadContent('pages/Index')
  }

}

这段代码背后真正的变化是:

复制代码
Ability 不再直接管理 UI

而是:

复制代码
Ability → Window → Page

四、系统边界的重新定义

我们来看 Stage 模型重新划分的几个关键边界。

1 应用边界(UIAbility)

职责:

复制代码
应用生命周期
全局资源
系统交互

不再负责:

复制代码
具体 UI
页面逻辑

2 窗口边界(WindowStage)

职责:

复制代码
窗口管理
多窗口能力
UI 容器

3 页面边界(Page / Component)

职责:

复制代码
UI 渲染
用户交互
局部状态

关键变化:

UI 被"下沉"到了更细粒度的层级

五、为什么这是"架构级变化"

这不是简单拆层,而是:

让系统从"单体结构"变成"分层结构"

旧模型

复制代码
Ability(大一统)

Stage 模型

复制代码
Ability
  ↓
Window
  ↓
Page

这带来的变化是:

1 支持多窗口

ts 复制代码
windowStage.createSubWindow("sub")

一个 Ability 可以管理多个 UI 容器

2 支持多实例

ts 复制代码
startAbility({
  want: {
    abilityName: "DetailAbility"
  }
})

同一个能力可以多开

3 支持跨设备

结合分布式能力:

ts 复制代码
startAbility({
  deviceId: remoteDeviceId
})

UI 可以运行在不同设备上

六、对开发者意味着什么

这才是最重要的部分。

1 不要再把 Ability 当"页面容器"

错误理解:

复制代码
Ability = 页面

正确理解:

复制代码
Ability = 应用入口(类似进程 / 容器)

2 页面应该完全独立

ts 复制代码
@Component
struct DetailPage {
  @State data: any
}

页面不依赖 Ability

3 架构必须分层

推荐结构:

复制代码
entry
 ├─ ability
 ├─ pages
 ├─ components
 ├─ services
 ├─ repository

4 为多窗口设计

不要默认:

复制代码
只有一个 UI

而要考虑:

复制代码
多个窗口同时存在

七、一个典型对比

旧写法(FA)

ts 复制代码
onStart() {
  this.setUIContent("pages/index")
  this.loadData()
}

问题:

复制代码
UI + 逻辑耦合

Stage 写法

ts 复制代码
onWindowStageCreate(stage) {
  stage.loadContent("pages/index")
}

页面:

ts 复制代码
aboutToAppear() {
  this.loadData()
}

职责分离清晰

八、为什么很多人"用错了 Stage"

因为很多项目只是:

复制代码
换 API
不换架构

例如:

ts 复制代码
// 依然把所有逻辑写在页面里

结果:

  • 页面越来越大
  • 逻辑越来越乱
  • 维护成本爆炸

九、本质总结

如果用一句话总结:

Stage 模型不是在改"生命周期",而是在重建"系统边界"。

对比:

维度 FA 模型 Stage 模型
核心 Ability 分层结构
UI 管理 Ability WindowStage
页面 从属 独立
架构 单体 分层

结语

很多开发者刚开始用 Stage 模型时,会觉得:

"没什么区别"

但当项目变复杂时,你会慢慢意识到:

它改变的是应用的"组织方式"。

如果你只把 Stage 当成:

复制代码
生命周期 API 升级

那你会很快遇到瓶颈。

但如果你把它当成:

复制代码
系统边界重构

那你会发现:

  • 架构更清晰
  • 模块更独立
  • 扩展能力更强
相关推荐
深念Y5 小时前
Docker Desktop 版本与 IDEA 插件兼容性
docker·云原生·容器·api·idea·wsl
用户528739463341 天前
AI 简历优化工具,一键润色,突出优势,提升求职通过率
api
笒鬼鬼2 天前
【API接口】最新可用红果短剧接口
算法·api·笒鬼鬼·红果短剧·接口源码
SuperherRo2 天前
API攻防-接口类型&测试方法&端点提取&暴漏攻击&枚举规则&RESTful风格&GraphQL语法
api·restful·graphql
147API2 天前
2026开发者实测:四大AI大模型API聚合网关SLA与延迟对决
api·api中转·api大模型·api大模型中转
winfredzhang4 天前
用 Python + DeepSeek AI 构建文件批量重命名与智能管理工具
python·api·重命名·预览·解压·deepseek
razelan4 天前
本地大模型系列:2.通过API让本地大模型为你服务
人工智能·api·ollama·本地大模型
新诺韦尔API4 天前
手机号携号转网接口对接常见问题一览
大数据·api
API开发4 天前
一个MCP操作所有的数据库
数据库·api·api接口·apisql·mcp·mcpserver·openclaw