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 模型的核心配置文件

相关新闻

HarmonyOs应用《日记本》开发第1篇 - 构建完整项目

HarmonyOs应用《日记本》开发第1篇 - 构建完整项目

背景本人很喜欢写日记,所以很久之前就想做一个日记本相关的应用,这次正好有这个机会就以日记本为项目目标,开发一个日记本应用.日记本开发如下:项目概述 在本系列博客中,我们将以一个完整的鸿蒙(HarmonyOS&…

2026/7/25 6:54:25阅读更多 →
MiGPT终极指南:3步打造你的专属AI语音管家

MiGPT终极指南:3步打造你的专属AI语音管家

MiGPT终极指南:3步打造你的专属AI语音管家 【免费下载链接】mi-gpt 🏠 将小爱音箱接入 ChatGPT 和豆包,改造成你的专属语音助手。 项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt 想让家里的智能音箱真正"聪明"起…

2026/7/25 6:54:25阅读更多 →
Python实现手机号关联QQ号查询:技术原理、合规实现与工程实践

Python实现手机号关联QQ号查询:技术原理、合规实现与工程实践

1. 项目概述与核心需求解析最近在技术社区和开发者群里,经常看到有人讨论“手机号逆向查询QQ号”这个需求。乍一听,这像是一个“黑科技”或者灰色地带的工具,但深入接触后我发现,很多开发者的需求其实非常正当。比如,在…

2026/7/25 6:54:25阅读更多 →
预测编码与反向传播:理论关联与应用前景

预测编码与反向传播:理论关联与应用前景

1. 项目背景与研究意义预测编码(Predictive Coding)和反向传播(Backpropagation)是当前机器学习领域两个极具影响力的理论框架。预测编码源自神经科学领域,描述了大脑如何通过不断生成和修正预测来理解世界&#xff1b…

2026/7/25 8:18:36阅读更多 →
Codex AI编程实战:15个场景从环境搭建到高级应用

Codex AI编程实战:15个场景从环境搭建到高级应用

你是不是也遇到过这样的场景:想写个脚本处理数据,却要花半小时查语法;想快速生成一个API接口,却要重复写样板代码;甚至想给一段代码加注释,都觉得是件麻烦事。如果你对AI编程助手还停留在“只能补全简单代码”的印象,那可能错过了真正能改变工作流的工具。 最近,一个名…

2026/7/25 8:18:36阅读更多 →
基于迁移学习的脑肿瘤检测系统设计与实现

基于迁移学习的脑肿瘤检测系统设计与实现

1. 项目背景与核心价值 脑肿瘤检测一直是医学影像分析领域的重点研究方向。传统方法依赖放射科医生人工阅片,不仅效率低下(单个病例平均需要15-20分钟),且受主观因素影响较大。我们团队在临床实习时发现,三甲医院MRI检…

2026/7/25 8:18:36阅读更多 →
AI解高考题为何宕机?提示词工程与代码辅助实战指南

AI解高考题为何宕机?提示词工程与代码辅助实战指南

最近在技术圈和社交媒体上,一个有趣的现象引发了广泛讨论:当各类AI大模型被要求解答高考题目时,常常出现“宕机”——不是指服务器崩溃,而是指模型在逻辑推理、复杂计算或理解特定语境时“卡壳”,输出错误、混乱甚至完…

2026/7/25 8:18:36阅读更多 →
MySQL数据分析实战:从零搭建环境到SQL查询与业务场景应用

MySQL数据分析实战:从零搭建环境到SQL查询与业务场景应用

这次我们来看一个面向零基础小白的 MySQL 数据分析实战教程。对于想入门数据分析、处理业务数据、或者提升 SQL 技能的同学来说,MySQL 是一个绕不开的核心工具。它不仅是全球最流行的开源关系型数据库,更是数据分析师、后端开发、产品运营等岗位的必备技能。这套教程号称“20…

2026/7/25 8:18:36阅读更多 →
C++数组深度解析:从内存模型到容器应用与性能优化

C++数组深度解析:从内存模型到容器应用与性能优化

1. 项目概述:从“盒子”到“工具箱”——理解C数组的容器角色在C的世界里,当你听到“容器”这个词,脑海里可能首先浮现的是std::vector、std::map这些标准库里的明星。它们功能强大,灵活多变,是构建复杂数据结构的利器…

2026/7/25 8:16:36阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/25 1:01:14阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/25 1:01:14阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/25 1:01:14阅读更多 →
突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:01:16阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:01:16阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:01:16阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/24 23:01:03阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/24 19:00:40阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/24 19:00:40阅读更多 →