一、UIAbility 生命周期概述
UIAbility 是 HarmonyOS 应用的基本交互单元,负责管理用户界面(UI)和业务逻辑。其生命周期由系统调度,开发者通过重写回调方法响应状态变化。生命周期阶段包括:
- 初始化阶段:Ability 创建和窗口初始化。
- 前台阶段:Ability 可见且可交互。
- 后台阶段:Ability 不可见但未被销毁。
- 销毁阶段:Ability 资源释放。
二 、生命周期回调方法详解
1. onCreate
- 触发时机 :
UIAbility 首次创建时调用(冷启动或销毁后重新创建)。 - 核心用途 :
- 初始化全局资源(如数据库连接、网络配置)。
- 注册应用级事件监听(如系统广播)。
- 注意事项 :
- 避免耗时操作(如大量数据加载),否则影响启动速度。
- 不在此处执行 UI 相关操作(窗口尚未创建)。
typescript
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// 初始化非 UI 资源
Logger.info('UIAbility onCreate');
}
2. onWindowStageCreate
- 触发时机 :
UIAbility 的 窗口(WindowStage)创建完成后调用。 - 核心用途 :
- 加载 UI 布局(通过
windowStage.loadContent
)。 - 初始化与窗口相关的资源(如多媒体播放器)。
- 加载 UI 布局(通过
- 示例代码:
typescript
onWindowStageCreate(windowStage: window.WindowStage): void {
// 加载主页面
windowStage.loadContent('pages/Index', (err) => {
if (err) {
Logger.error('加载页面失败');
return;
}
Logger.info('UIAbility 主页面加载完成');
});
}
3. onForeground
- 触发时机 :
UIAbility 从后台切换到前台时触发(如用户返回应用、其他 Ability 关闭)。 - 核心用途 :
- 恢复暂停的业务逻辑(如动画、传感器监听)。
- 刷新动态数据(如从后台唤醒时更新实时信息)。
- 注意事项 :
- 快速完成,避免阻塞用户交互。
typescript
onForeground(): void {
// 恢复音乐播放
audioPlayer.play();
Logger.info('UIAbility 进入前台');
}
4. onBackground
- 触发时机 :
UIAbility 从前台切换到后台时触发(如用户跳转到其他 Ability 或回到桌面)。 - 核心用途 :
- 暂停消耗资源的操作(如停止动画、释放摄像头)。
- 保存临时状态(如未提交的表单数据)。
- 限制 :
- 最多有 10 秒执行时间,超时可能导致应用被终止。
typescript
onBackground(): void {
// 暂停网络请求
httpRequest.cancel();
Logger.info('UIAbility 进入后台');
}
5. onWindowStageDestroy
- 触发时机 :
UIAbility 的 窗口(WindowStage)即将销毁时调用(如关闭当前 Ability 或触发配置变更)。 - 核心用途 :
- 释放窗口相关资源(如取消定时器、解绑 UI 事件)。
- 清理与窗口绑定的数据(如 WebView 实例)。
typescript
onWindowStageDestroy(): void {
// 释放 WebView 资源
webView.destroy();
Logger.info('UIAbility 窗口销毁');
}
6. onDestroy
- 触发时机 :
UIAbility 即将被销毁时调用(用户主动退出或系统回收资源)。 - 核心用途 :
- 释放所有全局资源(如数据库连接、文件句柄)。
- 注销全局事件监听(避免内存泄漏)。
- 关键点 :
- 必须确保所有资源释放,否则可能导致内存泄漏。
typescript
onDestroy(): void {
// 关闭数据库连接
database.close();
Logger.info('UIAbility 销毁');
}
三、 生命周期流程图
markdown
启动 Ability → onCreate → onWindowStageCreate → onForeground
│
├── 切换后台 → onBackground
│ │
│ └── 返回前台 → onForeground
│
├── 窗口销毁 → onWindowStageDestroy
│ │
│ └── 重建窗口 → onWindowStageCreate
│
└── 销毁 Ability → onDestroy
四、高频问题
-
onCreate
和onWindowStageCreate
的区别是什么?- 答 :
onCreate
用于初始化全局非 UI 资源,onWindowStageCreate
用于加载 UI 和窗口相关资源。
- 答 :
-
如何保存 UIAbility 的状态以便重建后恢复?
- 答 :在
onBackground
中保存数据到AppStorage
或Preferences
,在onWindowStageCreate
中恢复。
- 答 :在
-
为何在
onBackground
中不能执行耗时操作?- 答:系统限制后台回调执行时间(最长 10 秒),超时会导致应用被强制终止。
开发注意事项
- 避免内存泄漏 :在
onDestroy
中确保释放所有资源(如注销事件监听)。 - 状态保存 :使用
AppStorage
或Preferences
持久化关键数据,应对 Ability 重建。 - 性能优化 :在
onForeground
中延迟加载非必要数据,提升用户体验。