HarmonyOS UIAbility 生命周期:onCreate、onWindowStageCreate、onForeground、onBackground 怎么分工
系列:HarmonyOS 开发入门 · 06
刚开始写 HarmonyOS 时,很容易把 EntryAbility.ets 当成“系统生成的文件,别动”。
实际上很多应用级初始化、窗口加载、前后台切换处理都和 UIAbility 有关。只不过它和页面生命周期关注的层级不一样。
1. UIAbility 是什么层级
可以先粗略理解:
应用进程
└── UIAbility
└── WindowStage
└── ArkUI 页面
页面里的 aboutToAppear、onPageShow 关注 UI;UIAbility 关注的是更上层的应用组件生命周期。
2. 一个典型 EntryAbility
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'
import { window } from '@kit.ArkUI'
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
console.info('EntryAbility onCreate')
}
onWindowStageCreate(windowStage: window.WindowStage): void {
console.info('onWindowStageCreate')
windowStage.loadContent('pages/Index', (err) => {
if (err.code) {
console.error(`loadContent failed: ${JSON.stringify(err)}`)
return
}
console.info('loadContent success')
})
}
onForeground(): void {
console.info('onForeground')
}
onBackground(): void {
console.info('onBackground')
}
onDestroy(): void {
console.info('onDestroy')
}
}
实际模板代码可能略有差异,但主干就是这些。
3. onCreate:Ability 实例创建
onCreate 更适合做和 UIAbility 实例本身相关的初始化。
比如:
- 读取启动参数;
- 初始化部分全局能力;
- 注册和 Ability 生命周期绑定的监听。
不过不要什么都往这里塞。
应用冷启动性能问题,很多时候就是因为启动阶段同步做了太多磁盘、数据库、网络操作。
4. onWindowStageCreate:窗口准备好了
窗口相关操作应该放在窗口生命周期里理解。
最典型就是:
windowStage.loadContent('pages/Index')
如果要获取主窗口、设置窗口属性,也通常会围绕 WindowStage 处理。
不要把“Ability 创建”和“窗口创建”当成同一件事。
5. onForeground / onBackground:前后台切换
当 UIAbility 进入前台:
onForeground()
进入后台:
onBackground()
适合处理真正与 Ability 前后台状态绑定的逻辑,例如:
- 前台恢复某些服务状态;
- 后台暂停高消耗任务;
- 记录前后台状态。
如果只是某一个页面需要刷新,不要把业务请求全放在 onForeground。
否则以后应用里页面一多,会发现“回前台所有东西都一起刷新”。
6. onDestroy:不要把它当成一定会执行的“最终保险”
生命周期回调适合正常资源清理,但移动系统存在进程被回收等情况。
重要数据应该在合适的业务时机持久化,而不是寄希望于 onDestroy 最后帮你保存。
这个原则和 iOS/Android 开发其实很像。
7. UIAbility 生命周期和页面生命周期怎么配合
可以这样分:
UIAbility 层
处理应用组件级事件:
启动
窗口
前台
后台
销毁
页面层
处理当前页面业务:
页面进入
页面返回
页面隐藏
页面销毁
一个详情页需要刷新评论列表,这属于页面层;应用整体进后台后暂停某个全局任务,才更像 Ability 层。
8. 不要在 onCreate 里做“全家桶初始化”
真实项目里很常见:
初始化数据库
初始化统计
初始化网络
读取几十项配置
创建多个单例
加载用户信息
检查更新
全部塞进启动路径。
能延迟的延迟,能按需的按需,能异步的异步。启动速度是用户对 App 的第一感受。
总结
UIAbility 生命周期最重要的不是背顺序,而是把职责分清:
onCreate:Ability 实例创建;onWindowStageCreate:窗口创建和页面内容加载;onForeground:进入前台;onBackground:进入后台;onDestroy:Ability 销毁清理。
下一篇进入页面路由,也是新手最容易看到两套方案然后纠结的地方:router 和 Navigation 到底怎么选。
更多推荐



所有评论(0)