HarmonyOs应用《日记本》开发第2篇 - Stage模型
HarmonyOS 提供了两种应用模型FAFeature Ability模型和 Stage 模型。从 HarmonyOS 3.1开始Stage 模型成为官方推荐的应用开发模型。我们的日记应用正是基于 Stage 模型构建的。本篇将深入解析 Stage模型的核心概念并通过日记项目的实际代码来理解其工作原理。Stage 模型 vs FA 模型核心区别特性FA 模型Stage 模型开发范式类 Ace 开发ArkTS 声明式组件模型PageAbility / ServiceAbilityUIAbility / ExtensionAbility配置文件config.jsonmodule.json5生命周期较简单更完善支持多实例、多窗口UI 开发JS/ArkTS 混合纯 ArkTS 声明式数据共享DataAbilityDataShareExtensionAbility为什么选择 Stage 模型更清晰的架构UI 与业务逻辑分离UIAbility 专注窗口管理更强大的生命周期支持前后台切换、多窗口、多实例更好的扩展性ExtensionAbility 支持多种场景扩展统一的配置体系json5 格式配置更灵活可读Stage 模型的核心概念1. UIAbilityUIAbility 是 Stage 模型中带有 UI 界面的组件负责与用户交互。在我们的日记应用中// EntryAbility.etsimport{UIAbility,AbilityConstant,Want}fromkit.AbilityKit;import{window}fromkit.ArkUI;import{diaryStore}from../utils/DiaryStore;exportdefaultclassEntryAbilityextendsUIAbility{asynconCreate(want:Want,launchParam:AbilityConstant.LaunchParam):Promisevoid{// 初始化数据存储awaitdiaryStore.init(this.context);}onWindowStageCreate(windowStage:window.WindowStage):void{windowStage.loadContent(pages/Index,(err){if(err.code){console.error(Failed to load content. cause: JSON.stringify(err));return;}console.info(Succeeded in loading content.);});}}2. WindowStageWindowStage 是窗口管理器每个 UIAbility 实例都持有一个 WindowStage负责加载和管理 UI 内容onWindowStageCreate(windowStage:window.WindowStage):void{// 加载入口页面windowStage.loadContent(pages/Index,(err){// 回调处理});}3. ContextContext 是应用上下文对象提供了访问应用资源、文件系统、偏好存储等能力。在日记项目中Context 被传递给 DiaryStore 进行数据初始化asynconCreate(want:Want,launchParam:AbilityConstant.LaunchParam):Promisevoid{awaitdiaryStore.init(this.context);// this.context 即 UIAbility 的上下文}DiaryStore 接收 Context 并初始化 Preferencesasyncinit(context:Context):Promisevoid{this.storeawaitpreferences.getPreferences(context,{name:diary_store});}UIAbility 生命周期详解Stage 模型中 UIAbility 的生命周期比 FA 模型更加丰富应用启动 │ ▼ onCreate(want, launchParam) │ → 初始化数据存储 ▼ onWindowStageCreate(windowStage) │ → 加载首页 pages/Index ▼ onForeground() │ → 应用进入前台可交互 ▼ [用户使用中...] │ ▼ onBackground() │ → 应用进入后台 ▼ onWindowStageDestroy() │ → 窗口销毁 ▼ onDestroy() │ → Ability 销毁 ▼ [进程可能被回收]日记项目中的生命周期实现exportdefaultclassEntryAbilityextendsUIAbility{// 1. Ability 创建时调用asynconCreate(want:Want,launchParam:AbilityConstant.LaunchParam):Promisevoid{awaitdiaryStore.init(this.context);}// 2. 新的调用singleInstance 模式下会触发onNewSession(want:Want,launchParam:AbilityConstant.LaunchParam):void{}// 3. 窗口创建时调用onWindowStageCreate(windowStage:window.WindowStage):void{windowStage.loadContent(pages/Index,(err){if(err.code){console.error(Failed to load content. cause: JSON.stringify(err));return;}console.info(Succeeded in loading content.);});}// 4. 窗口销毁时调用onWindowStageDestroy():void{}// 5. 应用进入前台onForeground():void{}// 6. 应用进入后台onBackground():void{}// 7. Ability 销毁onDestroy():void{}}生命周期中的数据初始化策略在本项目中数据存储的初始化放在onCreate中asynconCreate(want:Want,launchParam:AbilityConstant.LaunchParam):Promisevoid{awaitdiaryStore.init(this.context);}为什么放在 onCreateonCreate是 Ability 生命周期的第一个回调此时 Context 已经可用可以安全地初始化存储在onWindowStageCreate加载 UI 之前完成确保页面加载数据时存储已就绪使用await确保异步初始化完成后再继续Want 机制onCreate接收的want参数包含了启动 Ability 时传递的信息interfaceWant{bundleName?:string;// 目标包名abilityName?:string;// 目标 Ability 名uri?:string;// URItype?:string;// MIME 类型parameters?:Recordstring,Object;// 自定义参数}在日记应用中want由系统在桌面图标点击时传入携带了entity.system.home和action.system.home信息使应用作为桌面入口启动。module.json5 中的 Ability 配置Stage 模型的配置在module.json5中完成{ module: { name: entry, type: entry, description: $string:module_desc, mainElement: EntryAbility, deviceTypes: [phone, tablet], deliveryWithInstall: true, installationFree: false, pages: $profile:main_pages, abilities: [ { name: EntryAbility, srcEntry: ./ets/entryability/EntryAbility.ets, description: $string:EntryAbility_desc, icon: $media:app_icon, label: $string:EntryAbility_label, startWindowIcon: $media:app_icon, startWindowBackground: $color:start_window_background, exported: true, skills: [ { entities: [entity.system.home], actions: [action.system.home] } ] } ] } }关键字段解读字段说明mainElement模块的主入口 AbilitysrcEntryAbility 源码路径deviceTypes支持的设备类型pages页面路由配置指向$profile:main_pagesskills声明 Ability 可响应的意图exported是否允许其他应用调用startWindowIcon启动窗口图标startWindowBackground启动窗口背景色Stage 模型的页面加载机制在 Stage 模型中页面路由通过main_pages.json配置{src:[pages/Index,pages/DiaryEdit,pages/DiaryDetail]}页面之间通过router模块进行导航import{router}fromkit.ArkUI;// 跳转到编辑页router.pushUrl({url:pages/DiaryEdit});// 跳转到详情页并传参router.pushUrl({url:pages/DiaryDetail,params:{id:item.id}});// 返回上一页router.back();小结Stage 模型是 HarmonyOS 推荐的应用开发模型提供了更清晰的架构设计和更强大的生命周期管理。通过日记项目的EntryAbility实现我们理解了UIAbility 是 UI 交互的核心载体生命周期回调各有分工onCreate负责初始化onWindowStageCreate负责加载 UIContext 是访问系统能力的桥梁module.json5 是 Stage 模型的核心配置文件