深入理解鸿蒙 Stage 应用模型掌握 UIAbility 生命周期一、前言HarmonyOS 的应用模型经历了从 FAFeature Ability模型到 Stage 模型的演进。Stage 模型是鸿蒙 NEXT 时代的主推架构它提供了更清晰的生命周期管理、更好的模块化支持和更灵活的多实例管理能力。本文将详细讲解 Stage 模型的核心概念并结合徒步迹App 的 EntryAbility 实现进行实战分析。二、Stage 模型 vs FA 模型对比项FA 模型Stage 模型架构复杂度简单中等多实例支持有限原生支持模块化较弱通过 HAP/HSP/HAR 灵活组织生命周期基础更完善推荐场景简单应用复杂应用推荐兼容性不再更新当前主推结论新开发的应用统一使用 Stage 模型。三、Stage 模型架构Stage 模型的核心层级应用层App └── 模块层Module: HAP/HSP/HAR └── Ability 层UIAbility / ExtensionAbility └── 页面层Page └── 组件层Component3.1 关键概念Ability应用的功能单元分为UIAbility有 UI 界面的 Ability如主界面ExtensionAbility无 UI 的后台服务 Ability如后台定位Module功能模块有三种类型HAP (Harmony Ability Package)可独立部署的应用包HSP (Harmony Shared Package)共享库包HAR (Harmony Archive)静态归档库四、UIAbility 详解UIAbility 是 Stage 模型中最核心的类继承自UIAbility基类。4.1 生命周期import{UIAbility,AbilityConstant,Want}fromkit.AbilityKit;import{window}fromkit.ArkUI;exportdefaultclassEntryAbilityextendsUIAbility{// 1. Ability 创建时调用onCreate(want:Want,launchParam:AbilityConstant.LaunchParam):void{console.info([徒步迹] onCreate);// 初始化全局数据、数据库连接等AppStorage.setOrCreate(isLogged,false);}// 2. Ability 销毁时调用onDestroy():void{console.info([徒步迹] onDestroy);// 释放资源、保存状态}// 3. WindowStage 创建**关键**加载主页面onWindowStageCreate(windowStage:window.WindowStage):void{console.info([徒步迹] onWindowStageCreate);// 加载首页启动页windowStage.loadContent(pages/SplashPage,(err){if(err){console.error(加载失败:${JSON.stringify(err)});return;}});}// 4. WindowStage 销毁onWindowStageDestroy():void{console.info([徒步迹] onWindowStageDestroy);}// 5. 切换到前台onForeground():void{console.info([徒步迹] onForeground);}// 6. 切换到后台onBackground():void{console.info([徒步迹] onBackground);// 保存应用状态释放资源}}4.2 生命周期流程图用户启动App ↓ onCreate() ← 创建 Ability ↓ onWindowStageCreate() ← 创建窗口加载页面 ↓ onForeground() ← 进入前台用户可见 ↓ [应用正常运行] ↓ onBackground() ← 进入后台按Home键/切到其他App ↓ [系统可能回收] ↓ onForeground() ← 重新回到前台 ↓ onWindowStageDestroy() ← 窗口销毁 ↓ onDestroy() ← Ability 销毁五、Ability 启动模式Stage 模型支持 3 种启动模式// module.json5 中配置 launchType { abilities: [ { name: EntryAbility, launchType: singleton, // 启动模式 } ] }模式说明适用场景singleton单实例默认主界面只有一个实例standard多实例需要独立多个实例时multiton多实例复用类似浏览器多标签页徒步迹 App 使用默认的singleton模式即可。六、Want 与跨 Ability 通信Want 是 Ability 间通信的载体用于启动或传递数据// 启动另一个 UIAbilityfunctionstartAnotherAbility(context:Context):void{letwant:Want{bundleName:com.hiking.tuji,abilityName:AnotherAbility,parameters:{routeId:123,fromPage:HomePage,},};context.startAbility(want,(err){if(err){console.error(启动失败:${err.code});}});}// 接收参数在目标 Ability 的 onCreate 中onCreate(want:Want):void{if(want?.parameters){letrouteIdwant.parameters.routeIdasnumber;console.log(接收到 routeId:${routeId});}}七、Context 能力Context 是 Ability 运行时的上下文对象提供了丰富的系统能力// 获取上下文letcontext:Contextthis.context;// 获取应用信息letbundleName:stringcontext.bundleName;letversionCode:numbercontext.applicationInfo.versionCode;// 获取文件路径letcacheDir:stringcontext.cacheDir;lettempDir:stringcontext.tempDir;letfilesDir:stringcontext.filesDir;// 获取资源管理器letresourceManagercontext.resourceManager;// 读取资源文件letresMgrresourceManager;letstringValueresMgr.getStringSync($r(app.string.app_name));八、实战徒步迹的 EntryAbility以下是徒步迹的 EntryAbility 完整实现// entryability/EntryAbility.etsimport{UIAbility,AbilityConstant,Want}fromkit.AbilityKit;import{window}fromkit.ArkUI;exportdefaultclassEntryAbilityextendsUIAbility{onCreate(want:Want,launchParam:AbilityConstant.LaunchParam):void{console.info([徒步迹] EntryAbility onCreate);// 初始化全局应用存储AppStorage.setOrCreatenumber(stepCount,0);AppStorage.setOrCreatenumber(todayDistance,0);AppStorage.setOrCreatenumber(todayCalories,0);}onDestroy():void{console.info([徒步迹] EntryAbility onDestroy);}onWindowStageCreate(windowStage:window.WindowStage):void{console.info([徒步迹] EntryAbility onWindowStageCreate);// 设置窗口属性windowStage.getMainWindow((err,mainWindow){if(!err){// 设置全屏、状态栏等mainWindow.setWindowLayoutFullScreen(true);mainWindow.setWindowSystemBarEnable([status,navigation]);}});// 加载启动页windowStage.loadContent(pages/SplashPage,(err){if(err){console.error(加载启动页失败:${JSON.stringify(err)});return;}console.info(启动页加载成功);});}onWindowStageDestroy():void{console.info([徒步迹] EntryAbility onWindowStageDestroy);}onForeground():void{console.info([徒步迹] EntryAbility onForeground);}onBackground():void{console.info([徒步迹] EntryAbility onBackground);}}这是我们在项目中已经实现的 EntryAbility 代码完整的文件路径为entry/src/main/ets/entryability/EntryAbility.ets九、Application 与 AbilityStage除了 UIAbilityStage 模型还提供了应用级生命周期回调// 创建 AbilityStage在 module.json5 中配置exportdefaultclassMyAbilityStageextendsAbilityStage{onCreate():void{console.info([徒步迹] AbilityStage onCreate);// 应用级初始化日志系统、崩溃收集等}onAcceptWant(want:Want):string{// 多实例模式下返回实例标识returninstance_${Date.now()};}}在 module.json5 中配置{ module: { name: entry, srcEntry: ./ets/myabilitystage/MyAbilityStage.ets, // ... } }十、总结Stage 模型是鸿蒙 NEXT 应用开发的基石理解 UIAbility 的生命周期对于构建稳定、高效的 App 至关重要。本文从模型对比、生命周期详解到实战代码全面覆盖了 Stage 模型的核心知识。下一篇文章我们将学习 Navigation 路由系统实现页面间的无缝导航。下一篇预告鸿蒙原生开发手记徒步迹 - 页面路由与Navigation导航欢迎留言交流一起探索鸿蒙开发。