系列:HarmonyOS 开发入门 · 06

刚开始写 HarmonyOS 时,很容易把 EntryAbility.ets 当成“系统生成的文件,别动”。

实际上很多应用级初始化、窗口加载、前后台切换处理都和 UIAbility 有关。只不过它和页面生命周期关注的层级不一样。

1. UIAbility 是什么层级

可以先粗略理解:

应用进程
└── UIAbility
    └── WindowStage
        └── ArkUI 页面

页面里的 aboutToAppearonPageShow 关注 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 销毁清理。

下一篇进入页面路由,也是新手最容易看到两套方案然后纠结的地方:routerNavigation 到底怎么选。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐