ArkTS 采用分层生命周期设计,从应用进程到 UI 组件共分为 6 个层级,不同层级负责不同范围的资源管理与状态回调。当前 HarmonyOS NEXT 已完全废弃 FA 模型,以下均为 Stage 模型下的标准生命周期。

一、应用级生命周期(Application)

全局唯一,对应整个应用进程的生命周期,在 AppScope/app.ets 中定义,是应用最早初始化、最后销毁的层级。

表格

生命周期函数触发时机典型用途
onCreate()应用进程首次创建时触发,全局仅执行 1 次全局 SDK 初始化、全局异常捕获、全局状态初始化
onDestroy()应用进程完全销毁时触发全局资源释放、持久化数据保存
onConfigurationUpdated(config)系统全局配置变更时触发,包括系统语言、深浅色模式、屏幕方向、字体大小等全局主题切换、语言切换后的适配处理
onMemoryLevel(level)系统内存不足时触发,返回当前内存告警等级释放非必要的大内存资源(如图片缓存、全局缓存),避免应用被系统杀死

二、模块级生命周期(AbilityStage)

每个 HAP/HSP 模块对应一个 AbilityStage 实例,是模块的全局入口,在模块首次加载时创建。需要在 module.json5srcEntry 字段指定入口文件才会生效。

表格

生命周期函数触发时机典型用途
onCreate()模块首次加载时触发,每个模块仅执行 1 次模块级初始化,如模块内通用 SDK、全局数据容器初始化
onDestroy()模块卸载 / 销毁时触发释放模块级资源,注销模块级监听
onAcceptWant(want)显式 Want 启动 UIAbility 时触发,可拦截启动请求实现 UIAbility 单实例模式、启动路由拦截、启动参数统一处理
onNewProcessRequest(want)新进程中启动 UIAbility 时触发多进程场景下的进程初始化、参数处理
onConfigurationUpdated(config)模块所属配置变更时触发模块级配置适配
onMemoryLevel(level)模块收到内存告警时触发释放模块内的缓存资源

三、UIAbility 生命周期(页面入口级)

UIAbility 是 Stage 模型中带 UI 界面的应用入口组件,每个 UIAbility 对应一个页面栈,是应用页面生命周期的核心。

标准生命周期(按启动顺序排列)

表格

生命周期函数触发时机典型用途
onCreate(want, launchParam)UIAbility 实例首次创建时触发,仅执行 1 次初始化 Ability 级数据、注册全局事件监听、获取启动参数
onWindowStageCreate(windowStage)窗口管理器创建完成时触发加载首页 UI(loadContent)、配置窗口属性、设置窗口导航栏 / 状态栏样式
onForeground()Ability 从后台进入前台,对用户可见时触发恢复页面动画、刷新实时数据、重启暂停的定时器 / 任务
onNewWant(want, launchParam)Ability 已存在(单实例模式),再次被启动时触发处理二次启动的参数、跳转指定页面
onBackground()Ability 从前台退入后台,对用户不可见时触发暂停动画、保存临时状态、停止非必要的后台任务
onWindowStageDestroy()窗口管理器即将销毁时触发释放 UI 相关资源、注销窗口事件监听
onDestroy()UIAbility 实例完全销毁时触发释放所有 Ability 级资源、注销所有监听、清理定时器

补充回调

表格

生命周期函数触发时机典型用途
onConfigurationUpdated(config)系统配置变更时触发页面级横竖屏、深浅色适配
onMemoryLevel(level)内存告警时触发释放页面内的大内存资源(如大图、渲染缓存)

四、窗口级生命周期(WindowStage)

WindowStage 是窗口管理的核心代理,其生命周期与 UIAbility 绑定,额外支持窗口事件的监听回调,通过 windowStage.on() 方式注册。

表格

事件回调触发时机典型用途
'windowStageEvent'(获焦 / 失焦)窗口获得 / 失去输入焦点时触发页面获焦时恢复播放、失焦时暂停播放(如视频页面)
'windowSizeChange'窗口大小变化时触发(如分屏、横竖屏切换)适配窗口尺寸变化,重新计算布局
'windowVisibleChange'窗口可见性变化时触发窗口隐藏时暂停渲染,显示时恢复

五、页面级生命周期(Navigation 路由页面)

仅被 Navigation 组件管理的 Page 页面生效,对应页面栈的入栈、出栈、切换操作,与应用前后台无关。

表格

生命周期函数触发时机典型用途
onPageShow()页面显示时触发(包括首次进入、从其他页面返回、应用切回前台)页面埋点、页面级数据刷新
onPageHide()页面隐藏时触发(包括跳转到其他页面、应用退后台)暂停页面任务、保存页面临时状态
onBackPress()用户点击返回键 / 手势返回时触发拦截返回操作(如二次确认退出、保存草稿)

注意:onPageShow/onPageHide 会跟随应用前后台触发;而 onForeground/onBackground 是 Ability 级,是整个应用的前后台回调。

六、自定义组件生命周期(最常用)

所有被 @Component 装饰的自定义组件通用,是日常开发中使用频率最高的生命周期。

标准生命周期(按执行顺序)

表格

生命周期函数触发时机典型用途注意事项
constructor()组件实例化时触发,仅执行 1 次初始化组件内部变量、非响应式数据不能访问父组件传入的 Props,此时 Props 尚未赋值
aboutToAppear()组件即将挂载、build 执行前触发,仅执行 1 次加载初始数据、注册事件监听、初始化定时器可访问 Props,是数据初始化的最佳时机
build()组件 UI 渲染函数,状态变化时会重新执行声明式构建 UI 结构纯函数原则:禁止写异步操作、修改状态、定时器,否则会导致无限重绘
onAppear()组件完成渲染、首次显示在屏幕上时触发获取组件尺寸、启动入场动画、初始化第三方 UI 库仅首次挂载时执行 1 次
aboutToUpdate()状态变化后、重新执行build前触发记录更新前的状态、做更新前的预处理禁止在此处修改状态,会导致循环更新
onUpdate()状态变化导致 UI 重新渲染完成后触发更新后执行 DOM 操作、同步第三方库状态每次状态更新后都会执行
aboutToDisappear()组件即将卸载、最后一次 build 后触发注销事件监听、清理定时器、释放资源(如 PixelMap)资源清理的核心位置,避免内存泄漏
onDisappear()组件完全卸载、从屏幕移除后触发最终清理、上报销毁埋点此时组件已不可见

可复用组件专属生命周期

仅在 LazyForEach 列表复用、@Reusable 装饰的组件中生效,用于列表项复用时的状态重置。

表格

生命周期函数触发时机典型用途
aboutToReuse(params)列表项被复用时触发,旧组件实例被复用给新数据重置组件内部状态、更新复用数据

七、完整启动执行流程(从点击图标到页面显示)

plaintext

Application.onCreate()
  → AbilityStage.onCreate()
    → UIAbility.onCreate()
      → UIAbility.onWindowStageCreate()
        → 根组件 constructor()
          → 根组件 aboutToAppear()
            → 根组件 build()(递归渲染所有子组件)
              → 根组件 onAppear()
      → UIAbility.onForeground()
        → 页面 onPageShow()

八、常见易错点

  1. 资源成对管理:所有在 aboutToAppear 中注册的监听、定时器,必须在 aboutToDisappear 中注销,否则会造成内存泄漏。
  2. build 函数禁忌:绝对不能在 build 中执行异步操作、修改状态、创建新对象,会导致严重的性能问题和无限重绘。
  3. 作用域区分:应用切后台会同时触发 onBackgroundonPageHide;页面跳转只会触发 onPageHide,不会触发 onBackground
  4. 层级边界onForeground 是整个 Ability 的前后台回调,onPageShow 是单个页面的显示回调,多页面 Ability 中需严格区分使用场景。
Logo

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

更多推荐