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

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐