HarmonyOS开发实战:小分享-从EntryAbility看UIAbility生命周期
前言在 HarmonyOS Stage 模型中UIAbility是承载 UI 的核心组件它的生命周期回调决定了 App 启动、前台、后台、销毁的全过程。本篇以小分享 App 的EntryAbility为例逐一拆解这些回调的触发时机与典型用法。掌握 UIAbility 生命周期是开发高质量 HarmonyOS 应用的重要基础相关 API 细节可参考 HarmonyOS UIAbility 官方文档。一、UIAbility 的核心回调1.1 EntryAbility.ets 完整代码小分享 App 的EntryAbility.ets完整代码如下import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from kit.AbilityKit; import { hilog } from kit.PerformanceAnalysisKit; import { window } from kit.ArkUI; const DOMAIN 0x0000; export default class EntryAbility extends UIAbility { onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { try { this.context.getApplicationContext().setColorMode( ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET ); } catch (err) { hilog.error(DOMAIN, testTag, Failed to set colorMode. Cause: %{public}s, JSON.stringify(err)); } hilog.info(DOMAIN, testTag, %{public}s, Ability onCreate); } onDestroy(): void { hilog.info(DOMAIN, testTag, %{public}s, Ability onDestroy); } onWindowStageCreate(windowStage: window.WindowStage): void { hilog.info(DOMAIN, testTag, %{public}s, Ability onWindowStageCreate); windowStage.loadContent(pages/Index, (err) { if (err.code) { hilog.error(DOMAIN, testTag, Failed to load: %{public}s, JSON.stringify(err)); return; } hilog.info(DOMAIN, testTag, %{public}s, Succeeded in loading the content.); }); } onWindowStageDestroy(): void { hilog.info(DOMAIN, testTag, %{public}s, Ability onWindowStageDestroy); } onForeground(): void { hilog.info(DOMAIN, testTag, %{public}s, Ability onForeground); } onBackground(): void { hilog.info(DOMAIN, testTag, %{public}s, Ability onBackground); } }1.2 六大回调函数小分享 App 重写了全部 6 个回调。下表给出它们的触发时机回调触发时机典型用途onCreateAbility 实例创建时初始化全局资源、设置颜色模式onDestroyAbility 实例销毁时释放资源、保存状态onWindowStageCreate窗口舞台创建时加载首个页面onWindowStageDestroy窗口舞台销毁时释放 UI 相关资源onForegroundAbility 切到前台时恢复动画、刷新数据onBackgroundAbility 切到后台时暂停耗时任务、释放内存提示这六个回调是 HarmonyOS 应用生命周期管理的核心开发者必须熟练掌握。二、生命周期时序分析2.1 启动时序App 启动时回调顺序如下App 进程启动 │ ├─► onCreate(want, launchParam) │ └─ want: 启动参数可读取 caller bundleName、URI 等 │ ├─► onWindowStageCreate(windowStage) │ └─ windowStage.loadContent(pages/Index) │ └─► onForeground() └─ UI 进入用户可见状态2.2 前后台切换时序用户切到后台再回前台的时序如下onBackground() → (后台运行) → onForeground()2.3 销毁时序Ability 被销毁系统回收或用户关闭时序如下onWindowStageDestroy() → onDestroy()三、onCreate 中的颜色模式初始化3.1 颜色模式设置onCreate中调用setColorMode让颜色模式跟随系统onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { try { this.context.getApplicationContext().setColorMode( ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET ); } catch (err) { hilog.error(DOMAIN, testTag, Failed to set colorMode. Cause: %{public}s, JSON.stringify(err)); } }3.2 ColorMode 三种取值ConfigurationConstant.ColorMode的三个取值如下COLOR_MODE_NOT_SET未设置跟随系统COLOR_MODE_DARK强制深色COLOR_MODE_LIGHT强制浅色3.3 关键技术点onCreate中处理颜色模式的关键点包括this.context是UIAbilityContext提供了 Ability 级 APIgetApplicationContext()拿到应用级 ContextsetColorMode(COLOR_MODE_NOT_SET)表示「跟随系统」用try/catch兜底避免配置异常导致启动失败四、onWindowStageCreate 与窗口挂载4.1 窗口舞台挂载windowStage是当前 Ability 持有的窗口舞台承载所有 UI 内容onWindowStageCreate(windowStage: window.WindowStage): void { windowStage.loadContent(pages/Index, (err) { if (err.code) { hilog.error(DOMAIN, testTag, Failed to load: %{public}s, JSON.stringify(err)); return; } hilog.info(DOMAIN, testTag, %{public}s, Succeeded in loading the content.); }); }4.2 loadContent 三种重载形式loadContent是WindowStage的核心 API常见的几种调用方式// 1. 仅加载页面不关心结果 windowStage.loadContent(pages/Index); // 2. 加载页面 回调可拿到错误信息 windowStage.loadContent(pages/Index, (err) { ... }); // 3. 加载页面 指定窗口选项 回调 windowStage.loadContent(pages/Index, options, (err) { ... });4.3 入口页选择策略注意这里传入的是pages/Index而不是pages/HomePage。原因在于小分享 App 在Index.ets中做了一次重定向到SplashPage便于在入口页统一处理启动埋点、版本检查等逻辑。提示loadContent加载的页面路径必须与main_pages.json中已注册的路径完全一致否则会加载失败导致白屏。五、hilog 日志规范5.1 hilog 基础用法小分享 App 在每个生命周期回调中都打了日志便于还原执行时序hilog.info(DOMAIN, testTag, %{public}s, Ability onCreate);参数说明如下参数含义本工程取值domain日志域标识模块0x0000tag日志标签便于过滤testTagformat格式字符串%{public}sargs实际日志内容Ability onCreate5.2 隐私修饰符hilog提供两种隐私修饰符%{public}s表示该字符串以明文输出%{private}s表示该字符串会自动脱敏显示为***如果是敏感信息应使用%{private}s自动脱敏避免隐私泄漏。5.3 五个 hilog APIHarmonyOS 提供了五个hilogAPI分别对应不同的日志级别hilog.debug(DOMAIN, tag, %{public}s, debug message); hilog.info(DOMAIN, tag, %{public}s, info message); hilog.warn(DOMAIN, tag, %{public}s, warn message); hilog.error(DOMAIN, tag, %{public}s, error message); hilog.fatal(DOMAIN, tag, %{public}s, fatal message);六、onForeground 与 onBackground 实战场景6.1 onForeground 典型用途onForeground在 Ability 切到前台时调用典型用途包括刷新时间敏感数据如未读消息恢复视频播放重新连接 WebSocket触发数据同步6.2 onBackground 典型用途onBackground在 Ability 切到后台时调用典型用途包括暂停计时器停止 GPS 上报释放相机资源保存草稿数据6.3 小分享 App 的实现小分享 App 当前在这两个回调中只打了日志后续可以扩展onForeground(): void { hilog.info(DOMAIN, testTag, %{public}s, Ability onForeground); // TODO: 刷新首页 Banner、热门分享等数据 } onBackground(): void { hilog.info(DOMAIN, testTag, %{public}s, Ability onBackground); // TODO: 暂停图片加载、保存编辑草稿 }七、生命周期常见误区7.1 误区一onCreate 中调用 loadContentonCreate时窗口舞台尚未创建调用loadContent会抛WindowStage is null异常onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { windowStage.loadContent(pages/Index); // ❌ windowStage 尚未创建 }正确做法是只在onWindowStageCreate中调用loadContent。7.2 误区二loadContent 回调中做耗时操作windowStage.loadContent(pages/Index, (err) { sleep(5000); // ❌ 阻塞 UI 线程 });回调运行在 UI 线程耗时操作会卡住首帧绘制。建议只做日志和轻量初始化。7.3 误区三忽略 try/catchsetColorMode在某些异常情况下会抛错如果不加try/catch整个onCreate会失败进而导致 App 无法启动。八、本篇核心知识点8.1 生命周期六大回调UIAbility 六大核心回调必须熟记onCreateAbility 实例创建时onDestroyAbility 实例销毁时onWindowStageCreate窗口舞台创建时onWindowStageDestroy窗口舞台销毁时onForegroundAbility 切到前台时onBackgroundAbility 切到后台时8.2 实战开发要点实战开发中需要重点关注以下几个要点颜色模式应在onCreate中初始化首个页面加载应在onWindowStageCreate中完成耗时操作应在onBackground中暂停在onForeground中恢复所有日志应使用hilog并区分隐私级别总结本文深入剖析了 HarmonyOS UIAbility 的六大生命周期回调结合小分享 App 的EntryAbility实现详细讲解了每个回调的触发时机、典型用途和常见误区。下一篇我们将深入WindowStage的loadContent机制看看窗口、页面、Ability 三者是如何协同的。附录完整实现细节1. 核心 API 参考API作用说明本文涉及的核心 API功能实现参见华为官方文档2. 完整代码示例// 核心功能代码 // 详见正文中的完整实现3. 常见问题排查问题原因解决方案编译错误import 路径错误检查路径和 API 版本运行时异常参数不合法使用 try/catch 捕获性能问题主线程耗时操作使用异步 API4. 最佳实践错误处理完善使用 try/catch 包裹资源及时释放避免内存泄漏异步操作使用 async/await权限配置完整按需申请5. 完整代码文件索引文件路径说明本文涉及的代码文件见正文6. 实现要点总结核心实现要点API 的正确使用方法和参数说明完整的代码实现流程常见问题的排查方案性能优化和安全建议7. 总结本文详细讲解了小分享 App 中对应功能的完整实现。通过本文的学习读者可以掌握 HarmonyOS 开发的核心 API 使用方法和最佳实践。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力

相关新闻

技术写作规范优化:提升内容质量与SEO收录效果

技术写作规范优化:提升内容质量与SEO收录效果

这次我们来看一个技术写作规范优化的项目。这个项目的核心价值在于帮助技术作者快速掌握专业的内容创作规范,避免常见的写作陷阱,提升文章质量和平台收录效果。对于技术博主来说,最关心的往往是:规范是否清晰可执行?能…

2026/10/17 9:29:14 阅读更多 →
中国机遇2.0:数字经济、绿色科技与高端制造的新引擎

中国机遇2.0:数字经济、绿色科技与高端制造的新引擎

1. 项目概述:解码"中国机遇2.0"的全球价值 世界经济论坛新领军者年会(俗称"夏季达沃斯")今年最引人注目的议题莫过于"中国机遇2.0"概念的提出。这个升级版的发展框架,正在重构跨国企业的战略版图—…

2026/10/17 9:29:16 阅读更多 →
MBOM 编辑工具功能介绍——EBOM 向 MBOM 转化

MBOM 编辑工具功能介绍——EBOM 向 MBOM 转化

在自动化装备制造领域,EBOM(工程物料清单)源于产品设计,仅定义零部件构成,缺少工位、工时、物料配送等生产维度信息,无法直接指导车间作业。MBOM(制造物料清单)作为面向生产的核心数…

2026/10/17 9:29:17 阅读更多 →

最新新闻

基于Unity和Blender的六边形行星生成器:网格、地形与关卡设计全解析

基于Unity和Blender的六边形行星生成器:网格、地形与关卡设计全解析

做太空题材或策略游戏时,程序化生成行星几乎是必答题。这篇文章要拆解的,是基于 Unity 和 Blender 构建一套六边形行星生成器引擎的完整技术路线:用 C# 在 Unity 里生成六边形球面网格,用噪声算法做出山脉、海洋和生态分布&#x…

2026/10/17 9:29:40 阅读更多 →
Unity程序化生成圆角路口网格:从道路中心线到Mesh的完整方案

Unity程序化生成圆角路口网格:从道路中心线到Mesh的完整方案

做交通模拟或者城市场景程序化建模时,最容易让人卡住的往往不是直道,而是路口。直道说白了就是一条拉伸的矩形带,可一到十字路口,两条路交叉处的路面网格要怎么生成,转角要不要带圆弧,贴图方向怎么才不会乱…

2026/10/17 9:29:40 阅读更多 →
产品上线后垃圾邮件防护:从邮箱配置到防爬实战

产品上线后垃圾邮件防护:从邮箱配置到防爬实战

最近在独立开发者社区里,经常能看到这样一句调侃:I launched on Product Hunt and all I got was spam email。翻译过来就是“我在 Product Hunt 上线了产品,结果除了垃圾邮件什么都没得到”。对于把 Product Hunt 当成产品首发阵地的开发者来…

2026/10/17 9:29:40 阅读更多 →
React实现合同文档结构树与双向定位的完整实践

React实现合同文档结构树与双向定位的完整实践

在合同审查这类 ToB 业务里,文档结构树几乎是标配功能。合同不像普通文章,动辄几十页、上百条条款,审査人员需要快速定位到某一条具体约定,或者在水印批注、条款比对时来回跳转。我刚接手一个合同审查项目时,第一版只是…

2026/10/17 9:29:40 阅读更多 →
手机号批量滚动抽奖:原生JS动画实现与避坑指南

手机号批量滚动抽奖:原生JS动画实现与避坑指南

简介:该资源是一份面向网页前端开发者的JavaScript手机号批量滚动抽奖实现代码,适用于年会、活动互动等场景,帮助读者快速搭建随机滚动、不重复中奖的抽奖页面。资料为单个PDF文档,压缩包大小仅56KB,内含完整示例代码与…

2026/10/17 9:29:40 阅读更多 →
WSL+tmux从零配置到实战:打造Windows高效命令行环境

WSL+tmux从零配置到实战:打造Windows高效命令行环境

最近帮朋友把一台Windows系统配成日常开发环境,发现很多人其实对WSL和tmux这两个名字都熟悉,但真正组合起来用的不多。我在Windows 10/11上用WSL跑了挺久,命令行工作从git到批量改文件、编译、挂机跑脚本,基本都搬进了tmux里。这篇…

2026/10/17 9:28:39 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →