在 HarmonyOS 架构中,UIAbility 是应用调度的最小单元。理解它的生命周期不仅是写好代码的基础,更是处理内存管理和用户体验的核心。
1. UIAbility 生命周期流程及职责边界
UIAbility 的生命周期由系统框架通过回调触发,形成了一个闭环。
核心阶段详解
| 生命周期回调 | 职责边界 (Responsibility) | 建议操作 |
|---|---|---|
| onCreate | 初始化阶段。实例创建时触发,仅执行一次。 | 初始化业务逻辑、变量、资源加载。不要在此处做耗时 UI 操作。 |
| onWindowStageCreate | UI 绑定阶段。窗口环境准备就绪。 | 设置 UI 界面加载(windowStage.loadContent)、设置窗口监听。 |
| onForeground | 可见阶段。UI 进入前台,即将与用户交互。 | 申请焦点、开启传感器监听、恢复动画、刷新实时数据。 |
| onBackground | 不可见阶段。UI 进入后台。 | 释放非必要资源(如地理位置监听)、停止动画、保存临时状态。 |
| onWindowStageDestroy | 窗口释放阶段。UI 界面销毁。 | 释放窗口资源、取消 UI 相关的监听。 |
| onDestroy | 销毁阶段。实例彻底退出。 | 清理全局资源、解绑服务、执行最后的持久化存储。 |
2. 冷启动 vs. 热启动:生命周期的差异
这是性能优化的关键点。冷启动关注的是“从无到有”,热启动关注的是“恢复状态”。
冷启动 (Cold Start)
- 触发条件: 应用进程不存在,或 UIAbility 实例已被彻底销毁。
- 执行路径:
onCreateonWindowStageCreateonForeground。 - 特点: 耗时最长,因为涉及进程创建、资源加载和整棵 UI 树的构建。
热启动 (Hot Start)
- 触发条件: UIAbility 实例驻留在内存中(处于后台),用户再次点击图标或从任务栏切回。
- 执行路径: 直接触发
onForeground(如果实例未被销毁,不走onCreate)。 - 特点: 极速响应。此时系统会触发
onNewWant回调,开发者应在此处理新的启动参数(Want)。
3. 被系统回收后的重建流程
当系统内存压力过大,处于 onBackground 状态的 UIAbility 可能会被系统强行回收(销毁实例但保留任务栈信息)。
重建路径:从头开始
如果用户从历史任务栏点击该应用,重建流程将遵循冷启动路径:
-
重新触发:
onCreateonWindowStageCreateonForeground。 -
数据恢复: * 自动恢复: 系统会尝试恢复一部分 UI 状态(如滚动位置、输入框内容,前提是配置了自动保存)。
- 手动恢复: 开发者应利用
onSaveState机制。在回收前,系统会触发onSaveState;重建时,onCreate的参数launchParam中会携带之前保存的want信息,开发者需手动读取并还原业务数据。
- 手动恢复: 开发者应利用
4. 开发者的避坑指南
- 不要在
onBackground做持久化: 因为系统回收可能非常突然,某些情况下onBackground可能执行不完。关键数据应在数据变更时立即持久化,或在onSaveState中处理。 - 区分销毁原因: 在
onDestroy中,无法直接判断是用户手动滑掉(主动销毁)还是系统回收(被动销毁)。应结合业务逻辑判断是否需要彻底清理缓存。 - 窗口监听: 只有在
onWindowStageCreate之后,windowStage才可用。试图在onCreate里操作 UI 窗口会导致崩溃。
想挑战更复杂的