HarmonyOS应用开发实战:猫猫大作战-如何管理启动参数、初始化全局状态和预加载配置
前言在 HarmonyOS 应用开发中每个应用都有一个或多个Ability作为入口。其中UIAbility是包含 UI 界面的应用组件负责管理应用窗口、生命周期和页面路由——它是整个应用的“大门“。本文以「猫猫大作战」的EntryAbility.ets源码为主线拆解 UIAbility 的完整生命周期、在module.json5中的注册方式以及onWindowStageCreate→loadContent的首屏加载链路带你吃透 HarmonyOS 应用入口的核心机制。提示本系列不讲 ArkTS 基础语法与环境搭建假设你已跟完第 1–70 篇。本篇是阶段三第 71 篇。一、项目中的 EntryAbility1.1 源码定位打开「猫猫大作战」项目entry/src/main/ets/entryability/EntryAbility.ets可以看到最精简的入口实现import { UIAbility, Want, AbilityConstant } from kit.AbilityKit; import { window } from kit.ArkUI; import { hilog } from kit.PerformanceAnalysisKit; const TAG: string EntryAbility; const DOMAIN: number 0xFF00; export default class EntryAbility extends UIAbility { onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { hilog.info(DOMAIN, TAG, %{public}s, Ability onCreate); } onDestroy() { hilog.info(DOMAIN, TAG, %{public}s, Ability onDestroy); } onWindowStageCreate(windowStage: window.WindowStage) { hilog.info(DOMAIN, TAG, %{public}s, Ability onWindowStageCreate); windowStage.loadContent(pages/Index, (err) { if (err.code) { hilog.error(DOMAIN, TAG, Failed to load the content. Cause: %{public}s, JSON.stringify(err) ?? ); return; } hilog.info(DOMAIN, TAG, %{public}s, Succeeded in loading the content.); }); } onWindowStageDestroy() { hilog.info(DOMAIN, TAG, %{public}s, Ability onWindowStageDestroy); } onForeground() { hilog.info(DOMAIN, TAG, %{public}s, Ability onForeground); } onBackground() { hilog.info(DOMAIN, TAG, %{public}s, Ability onBackground); } }1.2 结构解析元素说明来源UIAbility基类提供生命周期回调kit.AbilityKitWant启动参数携带目标、数据kit.AbilityKitAbilityConstant启动原因常量kit.AbilityKitWindowStage窗口阶段承载 UI 加载kit.ArkUIhilog系统日志工具kit.PerformanceAnalysisKit二、UIAbility 生命周期全景2.1 六个核心回调UIAbility 的生命周期包含6 个回调调用顺序如下冷启动onCreate → onWindowStageCreate → onForeground ↓ loadContent(pages/Index) ↓ Index 页面渲染aboutToAppear → build → onDidBuild ↓ 切后台onBackground 切前台onNewWant → onForeground ↓ 窗口销毁onWindowStageWillDestroy → onWindowStageDestroy 应用退出onDestroy2.2 各回调用途速查回调触发时机项目用途onCreate首次创建 Ability 实例初始化全局配置、日志onWindowStageCreateWindowStage 创建完成后加载首屏页面、订阅窗口事件onForegroundAbility 进入前台恢复游戏/定位等资源onBackgroundAbility 完全不可见暂停游戏、释放资源onWindowStageDestroyWindowStage 销毁后释放 WindowStage 资源onDestroyAbility 实例销毁前保存数据、释放全局资源2.3 各回调生命周期表import { UIAbility, Want, AbilityConstant } from kit.AbilityKit; import { window } from kit.ArkUI; import { hilog } from kit.PerformanceAnalysisKit; const TAG EntryAbility; const DOMAIN 0xFF00; export default class EntryAbility extends UIAbility { onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { // 冷启动时初始化一次读取配置、初始化日志 hilog.info(DOMAIN, TAG, onCreate called); // 此处可初始化全局数据如 AppStorage 预置默认值 AppStorage.setOrCreate(highScore, 0); } onWindowStageCreate(windowStage: window.WindowStage): void { // WindowStage 创建后加载首屏 hilog.info(DOMAIN, TAG, onWindowStageCreate called); // 订阅 WindowStage 事件获焦/失焦 windowStage.on(windowStageEvent, (data) { const eventType: window.WindowStageEventType data; switch (eventType) { case window.WindowStageEventType.ACTIVE: hilog.info(DOMAIN, TAG, 窗口获焦); break; case window.WindowStageEventType.INACTIVE: hilog.info(DOMAIN, TAG, 窗口失焦); break; case window.WindowStageEventType.HIDDEN: hilog.info(DOMAIN, TAG, 窗口隐藏); break; default: break; } }); // 加载首屏页面 windowStage.loadContent(pages/Index, (err) { if (err.code) { hilog.error(DOMAIN, TAG, 加载页面失败: %{public}s, JSON.stringify(err)); return; } hilog.info(DOMAIN, TAG, 页面加载成功); }); } onForeground(): void { hilog.info(DOMAIN, TAG, onForeground called); // 回到前台可恢复游戏引擎 } onBackground(): void { hilog.info(DOMAIN, TAG, onBackground called); // 切到后台可暂停游戏 } onWindowStageDestroy(): void { hilog.info(DOMAIN, TAG, onWindowStageDestroy called); } onDestroy(): void { hilog.info(DOMAIN, TAG, onDestroy called); // 保存高分到持久化存储 } }三、module.json5 中的注册3.1 配置结构UIAbility 必须在module.json5中注册才能被系统识别。猫猫大作战的entry/src/main/module.json5{ module: { name: entry, type: entry, deviceTypes: [tablet, phone, wearable], 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: [ { actions: [action.system.home] } ] } ] } }3.2 关键字段说明字段值含义nameEntryAbilityAbility 名称唯一标识srcEntry./ets/entryability/EntryAbility.ets源码路径exportedtrue允许其他应用通过 Want 启动skills[0].actionsaction.system.home桌面图标入口startWindowIcon$media:app_icon启动窗口图标startWindowBackground$color:start_window_background启动窗口背景色注意srcEntry路径相对于entry/src/main/目录。exported为true时其他应用可通过startAbility启动你的 Ability。四、启动流程时序4.1 冷启动时序用户点击桌面图标 ↓ Launcher 构造 Want → action.system.home ↓ AAFWKAbility Manager Service创建 UIAbility 实例 ↓ onCreate(want, launchParam) ← ① 第一次初始化 ↓ onWindowStageCreate(windowStage) ← ② 窗口创建 ↓ windowStage.loadContent(pages/Index) ← ③ 加载页面 ↓ Index.ets aboutToAppear → build → onDidBuild ← ④ 页面渲染 ↓ onForeground() ← ⑤ 进入前台 ↓ 用户可见、可交互4.2 热启动从后台回到前台用户从最近任务/桌面重新打开 ↓ onNewWant(want, launchParam) ← ① 携带新参数 ↓ onForeground() ← ② 进入前台 ↓ onPageShow() ← ③ Index 页面级回调五、Want 与启动参数5.1 Want 结构onCreate中接收的Want参数包含了启动的完整信息// Want 的核心字段 interface Want { deviceId?: string; // 目标设备 ID跨设备时使用 bundleName?: string; // 目标应用 Bundle 名称 abilityName?: string; // 目标 Ability 名称 uri?: string; // 通用资源标识符 type?: string; // MIME 类型 parameters?: Recordstring, Object; // 自定义参数 flags?: number; // 启动标记 }5.2 在 EntryAbility 中解析启动参数onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { // 解析启动原因 switch (launchParam.launchReason) { case AbilityConstant.LaunchReason.START_ABILITY: hilog.info(DOMAIN, TAG, 通过 startAbility 启动); break; case AbilityConstant.LaunchReason.CALL: hilog.info(DOMAIN, TAG, 通过 call 启动); break; case AbilityConstant.LaunchReason.CONTINUATION: hilog.info(DOMAIN, TAG, 通过跨端迁移启动); break; case AbilityConstant.LaunchReason.APP_RECOVERY: hilog.info(DOMAIN, TAG, 通过应用恢复启动); break; default: break; } // 解析自定义参数比如通过 DeepLink 启动 const targetPage want.parameters?.[targetPage] as string; if (targetPage) { AppStorage.setOrCreate(targetPage, targetPage); } }六、常见踩坑6.1 坑一loadContent 路径错误// 错误路径多了 src/ windowStage.loadContent(src/main/ets/pages/Index, ...); // ✅ 正确路径相对于 entry/src/main/ets/ windowStage.loadContent(pages/Index, (err) { if (err.code) { hilog.error(DOMAIN, TAG, 加载失败: %{public}s, JSON.stringify(err)); } });6.2 坑二忘记在 module.json5 注册// 错误只写了文件没在 abilities 数组中注册 { module: { abilities: [] // ❌ 空的系统找不到 EntryAbility } }表现应用启动直接闪退报Cannot find ability。6.3 坑三onBackground 中做耗时操作// 错误onBackground 中执行数据库写入等耗时操作 onBackground(): void { this.saveGameData(); // ❌ 可能耗时超过系统限制 } // ✅ 正确在 onPageHide 或异步任务中处理 onBackground(): void { // 仅标记状态不做耗时操作 AppStorage.set(isBackground, true); }onBackground()执行时间极短不适合做数据库事务、网络请求等操作。七、HiLog 日志验证7.1 日志输出在 DevEco Studio 中运行应用并过滤EntryAbility可以看到完整的生命周期调用链09:15:23.101 [INFO] EntryAbility: Ability onCreate 09:15:23.156 [INFO] EntryAbility: Ability onWindowStageCreate 09:15:23.201 [INFO] EntryAbility: Succeeded in loading the content. 09:15:23.225 [INFO] Index: Index aboutToAppear called 09:15:23.289 [INFO] Index: Index onDidBuild called 09:15:23.302 [INFO] EntryAbility: Ability onForeground7.2 使用 hilog 替代 console在EntryAbility.ets中官方推荐使用hilog而非console.log方面consolehilog性能未优化异步写入不阻塞主线程分级无DEBUG/INFO/WARN/ERROR/FATAL过滤按字符串按 DOMAIN TAG线上采集不支持支持 HiAppEvent 采集// 推荐在 EntryAbility 中使用 hilog import { hilog } from kit.PerformanceAnalysisKit; hilog.info(0xFF00, EntryAbility, 应用启动完成);八、总结EntryAbility是 HarmonyOS 应用的起点承载了冷启动初始化、窗口创建、首屏加载和前后台切换等核心职责。本文从「猫猫大作战」的实际源码出发覆盖了 UIAbility 的六大生命周期回调、module.json5 注册规范、Want 参数解析和常见踩坑。核心要点UIAbility 生命周期onCreate→onWindowStageCreate→onForeground/onBackground→onDestroyloadContent(pages/Index)负责加载首屏页面module.json5中必须注册 Ability 才能被系统识别onBackground不允许做耗时操作用hilog替代console.log进行日志输出下一篇预告第 72 篇将深入onCreate冷启动初始化讲解如何管理启动参数、初始化全局状态和预加载配置。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源UIAbility 组件生命周期官方文档UIAbility 概述UIAbility 使用指导module.json5 配置参考Want 与启动参数文档开源鸿蒙跨平台社区第 72 篇onCreate 冷启动初始化第 73 篇loadContent 首屏绑定

相关新闻

OpenClaw本地AI智能体框架部署指南:从Docker到多场景应用

OpenClaw本地AI智能体框架部署指南:从Docker到多场景应用

OpenClaw 作为近期备受关注的本地 AI 智能体框架,其核心团队将于 8 月 11 日在西雅图举办开发者见面会。这一活动不仅标志着项目进入新的发展阶段,也为广大开发者提供了深入了解其技术架构、部署方式和实际应用场景的重要窗口。本文将从技术视角出发&…

2026/7/28 2:25:06阅读更多 →
开源大模型技术对比:LLaMA、Qwen与DeepSeek

开源大模型技术对比:LLaMA、Qwen与DeepSeek

1. 开源大模型技术格局概述2023年以来的开源大模型领域呈现出爆发式增长态势,LLaMA 2/3、Qwen和DeepSeek三大系列模型凭借各自的技术特色形成了三足鼎立的局面。作为长期跟踪AI技术发展的从业者,我观察到这三个项目在模型架构、训练策略和应用场景上展现…

2026/7/28 2:23:06阅读更多 →
基于MCP协议构建IDA Pro自动化分析服务器:原理、实现与恶意代码分析实战

基于MCP协议构建IDA Pro自动化分析服务器:原理、实现与恶意代码分析实战

1. 项目概述:为什么我们需要一个IDA Pro的MCP Server?如果你长期从事恶意代码分析或逆向工程,肯定对IDA Pro这个“神器”又爱又恨。爱的是它无与伦比的静态分析能力,恨的是那些重复、繁琐的操作——比如,为了分析一个恶…

2026/7/28 2:23:06阅读更多 →
WarcraftHelper:让魔兽争霸3在现代电脑上焕发新生的3大核心技巧

WarcraftHelper:让魔兽争霸3在现代电脑上焕发新生的3大核心技巧

WarcraftHelper:让魔兽争霸3在现代电脑上焕发新生的3大核心技巧 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否还记得那个曾经让我…

2026/7/29 13:06:40阅读更多 →
GetQzonehistory:终极QQ空间备份工具,一键永久保存你的青春记忆

GetQzonehistory:终极QQ空间备份工具,一键永久保存你的青春记忆

GetQzonehistory:终极QQ空间备份工具,一键永久保存你的青春记忆 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾担心那些记录着青春岁月的QQ空间说说会随…

2026/7/29 13:06:40阅读更多 →
Python实现LSB图片隐写术:从原理到实战工具开发

Python实现LSB图片隐写术:从原理到实战工具开发

1. 项目概述:为什么我们需要自己的图片隐写工具? 在数字信息无处不在的今天,如何安全、隐蔽地传递一小段关键信息,而不引起任何第三方的注意,是一个既有趣又实用的需求。你可能遇到过这样的场景:想给朋友分…

2026/7/29 13:06:40阅读更多 →
人工蜂群算法优化氢燃料电池极化曲线参数辨识

人工蜂群算法优化氢燃料电池极化曲线参数辨识

1. 项目背景与研究意义 氢燃料电池作为清洁能源转换装置,其性能评估与优化一直是新能源领域的研究热点。极化曲线作为反映燃料电池性能的核心指标,其参数辨识的准确性直接影响系统效率评估和运行策略制定。传统参数辨识方法如最小二乘法在面对非线性、多…

2026/7/29 13:06:40阅读更多 →
揭秘!冲孔雕花铝单板性价比高的排名情况

揭秘!冲孔雕花铝单板性价比高的排名情况

工程人们在工装项目里常会遇到不少难题。像曲面造型生硬,实物和效果图相差甚远;厂家排产混乱,交期延误导致工地停工;前期测量或加工出错,尺寸不符、开孔错位,隐形成本不断增加;出了问题材料商和…

2026/7/29 13:06:40阅读更多 →
免费解锁9大网盘高速下载:LinkSwift直链解析工具完整指南

免费解锁9大网盘高速下载:LinkSwift直链解析工具完整指南

免费解锁9大网盘高速下载:LinkSwift直链解析工具完整指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…

2026/7/29 13:04:40阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/29 9:47:45阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/29 7:00:19阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/29 7:58:51阅读更多 →
28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“! 在构建复杂的 Agent 系统时,我们经常会遇到这样的场景:Agent 正在执行一个多步骤的任务,比如“下单购买商品”,但执行到一半时,我们…

2026/7/29 0:01:46阅读更多 →
自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

近日,国际专注开放式技术研发的声学品牌Nank南卡,正式官宣实力艺人曾舜晞担任品牌代言人。消息一经发出便轰动全网。为什么耳机品牌不选择流量明星、老牌歌手?而且是选择曾舜晞?让我们一起来探索一下!比起短期的流量&a…

2026/7/29 0:01:46阅读更多 →
【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

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

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

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

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

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

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

2026/7/29 4:31:51阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

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

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

2026/7/28 2:35:58阅读更多 →