你还在用 FA 模型“硬怼”鸿蒙开发?Stage 模型都把路铺好了你不走?

举报
bug菌 发表于 2025/12/25 12:05:12 2025/12/25
【摘要】 🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8 🌟前言:我得先“吐槽”一句(带点真情实感)😄讲真哈,很多同学第一次...

🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

🌟前言:我得先“吐槽”一句(带点真情实感)😄

讲真哈,很多同学第一次做 HarmonyOS 应用,最容易掉进一个坑:拿着 Android 的思维 + FA 模型的旧习惯,去硬刚 Stage 模型
  结果就是——目录看不懂、模块分不清、生命周期混成一锅粥,调试时像在和系统“猜拳”✊✋✌️。
  别慌!Stage 模型其实挺“讲道理”的:它更像现代应用工程体系,强调模块化、路由与生命周期的清晰边界。你把它当成“升级版工程架构”,一下就顺了。来,我带你把这块啃透!🦷✨

📚目录导航(本节:Stage 模型应用开发基础)🧭

  • 🆚 Stage 模型 vs FA 模型:到底差在哪?
  • 📦 应用包结构:APP / HAP 到底是啥关系?
  • 🧩 Entry / Feature 模块:主模块和能力模块怎么拆?
  • 🧠 Ability 组件:UIAbility 是“新主角”
  • ⏱️ 生命周期管理:别再把 onCreate 当万能钥匙了!
  • 🧪 实战小 Demo:一个 Stage 工程从结构到生命周期日志(带代码)

🆚1) Stage 模型 vs FA 模型:一个“工程化”,一个“历史包袱”🤣

先说结论:Stage 模型是推荐主流,FA 模型更偏历史兼容与过渡
你可以把它们理解成两代开发范式:

🧱FA 模型(Feature Ability)——“老派单元式”

  • Ability 为中心(FeatureAbility、ServiceAbility 等)
  • 工程组织相对“直给”,但模块化与扩展性差一点
  • 对新一代 ArkUI/ArkTS 体系衔接不如 Stage 顺滑
  • 更像:能用,但不够舒服

🚀Stage 模型(Stage Ability / UIAbility)——“现代工程化”

  • 模块化 + 生命周期更清晰 为核心
  • 主要使用 UIAbility + AbilityStage 组织应用运行
  • 更贴合 ArkTS/ArkUI 声明式 UI 与新工程体系
  • 更像:官方给你铺好的高速路🛣️

😄一句人话:
FA 模型像“旧城区小巷子”,能到目的地但容易绕;Stage 模型像“新修高架桥”,路线清晰还省油。

📦2) 应用包结构:APP / HAP 是什么关系?(别再把它俩当对立了)📦📦

这块很多人第一次看到就懵:怎么又 APP 又 HAP?我到底交付哪个?
别急,我们用“套娃”思路解释最清楚👇

🧷HAP(Harmony Ability Package)

  • 模块级交付包
  • 通常一个模块(Entry / Feature)编译出来就是一个 HAP
  • 里面包含该模块的资源、代码、配置(module.json5 等)

🎒APP(Application Package)

  • 应用级交付包(可以包含多个 HAP)
  • 你可以理解成:APP = 一个应用的“总包裹”,里面装多个“模块包裹”(HAP)

🧠关键关系:
一个 APP 可以包含多个 HAP
比如:主入口 HAP + 若干 Feature HAP(按需能力、分发、设备类型差异等)。

🧩3) Entry / Feature 模块:怎么拆才像个“正经工程”?🧰

Stage 模型的模块化思路非常明确:

🚪Entry 模块(主入口)

  • 应用的“主模块”
  • 通常包含:主 UIAbility、启动页面、核心资源
  • 负责承载应用最基本的启动路径

🧩Feature 模块(能力扩展)

  • 可选能力模块(比如:支付、地图、会员、设备协同等)
  • 适合拆分:大型功能、可复用功能、差异化部署功能
  • 更利于:多人协作、按需加载、版本迭代

😏我给你一个“工程味儿很浓”的拆分口诀:
Entry 放“必进门的”,Feature 放“可选房间的”。
主流程不进门就不能用的,就别拆出去折磨自己;能独立升级、独立维护、独立复用的,拆 Feature 才香。

🧠4) Ability 组件:UIAbility 才是 Stage 模型的“C 位”👑

在 Stage 模型里,UIAbility 是页面/交互能力的核心载体。你可以把它理解成:

  • 它既承担 UI 容器职责
  • 又拥有更“现代”的生命周期管理方式
  • 能更好地跟 ArkUI 页面(Page)衔接

另外还有一个经常被忽略但很重要的角色:

🎭AbilityStage(应用运行舞台)

  • 类似应用级的“舞台管理者”
  • 负责管理该模块下 Ability 的整体运行状态
  • 你可以在这里做模块级初始化(别啥都塞 UIAbility 里)

😂一句吐槽:
别把 UIAbility 当垃圾桶
初始化、路由、资源准备、全局状态……乱塞进去,后期你会想给过去的自己寄律师函。

⏱️5) 生命周期管理:别再“一个 onCreate 走天下”了🙃

Stage 模型的生命周期更强调:

  • 应用/模块级:AbilityStage
  • 页面/交互级:UIAbility
  • 页面组件级:ArkUI @Entry Component 的状态管理

✅UIAbility 常见生命周期(你至少要熟)

  • onCreate():创建时调用,适合轻量初始化
  • onWindowStageCreate():窗口舞台创建,适合设置主页面 loadContent()
  • onForeground():到前台
  • onBackground():到后台
  • onDestroy():销毁释放资源

🧠最实用的经验:

  • UI 相关初始化:尽量放 onWindowStageCreate()
  • 资源释放、断连:放 onBackground() / onDestroy()
  • 不要在 onCreate 里塞重活:启动卡顿会骂你(真的会)😅

🧪6) 实战小 Demo:用日志把 Stage 生命周期“跑一遍”🏃‍♂️💨

下面给你一个非常实用的 ArkTS 示例:
目标:你一运行就能在日志里看到生命周期顺序,这玩意儿调试时贼好用。

EntryAbility.ets(UIAbility 示例)

import UIAbility from '@ohos.app.ability.UIAbility';
import window from '@ohos.window';

export default class EntryAbility extends UIAbility {
  onCreate(want: any, launchParam: any) {
    console.info('😄 [EntryAbility] onCreate');
  }

  onWindowStageCreate(windowStage: window.WindowStage) {
    console.info('🪟 [EntryAbility] onWindowStageCreate');
    // ⭐在这里加载页面最合适:UI准备就绪
    windowStage.loadContent('pages/Index', (err) => {
      if (err.code) {
        console.error(`❌ loadContent failed: ${JSON.stringify(err)}`);
        return;
      }
      console.info('✅ loadContent success');
    });
  }

  onForeground() {
    console.info('🌞 [EntryAbility] onForeground');
  }

  onBackground() {
    console.info('🌙 [EntryAbility] onBackground');
  }

  onWindowStageDestroy() {
    console.info('🧹 [EntryAbility] onWindowStageDestroy');
  }

  onDestroy() {
    console.info('🧨 [EntryAbility] onDestroy');
  }
}

pages/Index.ets(最小页面)

@Entry
@Component
struct Index {
  build() {
    Column() {
      Text('🚀 Stage 模型:Hello UIAbility!')
        .fontSize(20)
      Text('😏 打开日志看看生命周期顺序~')
        .margin({ top: 12 })
    }.padding(20)
  }
}

🎯你会在日志里看到大致顺序:
onCreateonWindowStageCreateloadContent successonForeground
切后台:onBackground
返回前台:onForeground
关闭/销毁:onWindowStageDestroyonDestroy
(具体细节会随设备/系统策略略有差别,但大体规律就是这样。)

✅本节小结(给你一个“带走就能用”的总结)🎒

  • Stage 模型是主流:更工程化、更适配 ArkTS/ArkUI
  • APP 是应用总包,HAP 是模块包:APP 可包含多个 HAP
  • Entry 是必需主模块,Feature 是可选能力模块:拆分要讲策略
  • UIAbility 是页面能力核心:别把初始化全塞 onCreate
  • 生命周期要分层:AbilityStage(模块级)+ UIAbility(交互级)+ ArkUI(组件级)

🧧福利赠与你🧧

  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学SpringBoot」专栏(全网一个名),bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大, 无边无际,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

✨️ Who am I?

我是bug菌(全网一个名),CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主/价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。