我来查看官方文档中关于 UIAbility 生命周期 的详细说明,并为你系统梳理 ArkUI 完整的生命周期体系。
在鸿蒙应用开发中,生命周期分为两个层级UIAbility 生命周期(应用/页面容器级)和自定义组件生命周期(ArkUI 组件级)。理解它们的分工与协作是掌握 ArkTS 开发的关键。


一、UIAbility 生命周期(Stage 模型)

UIAbility 是包含 UI 界面的应用组件(类似 Android 的 Activity 或 iOS 的 ViewController),它管理着应用与系统之间的交互。

核心生命周期回调

import { UIAbility, Want, AbilityConstant } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';

export default class EntryAbility extends UIAbility {
  
  // 1. 创建阶段:Ability 首次创建时触发(全局只执行一次)
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    console.info('EntryAbility onCreate');
    // 初始化应用级别的数据、恢复状态等
    AppStorage.setOrCreate('currentUser', want.parameters?.userId);
  }

  // 2. 窗口创建阶段:UI 界面初始化
  onWindowStageCreate(windowStage: window.WindowStage): void {
    console.info('EntryAbility onWindowStageCreate');
    
    // 加载主页面
    windowStage.loadContent('pages/Index', (err, data) => {
      if (err.code) {
        console.error('Failed to load content');
        return;
      }
      console.info('Succeeded in loading content');
    });
  }

  // 3. 前台阶段:Ability 变为可见且可交互(关键!)
  onForeground(): void {
    console.info('EntryAbility onForeground');
    // 申请资源:开启定位、重新连接 WebSocket、恢复音乐播放等
    LocationManager.startTracking();
  }

  // 4. 后台阶段:Ability 完全不可见(不一定会销毁,只是隐藏)
  onBackground(): void {
    console.info('EntryAbility onBackground');
    // 释放资源:停止定位、暂停下载、保存临时状态等
    // ⚠️ 注意:这里不能执行耗时操作(如数据库同步),因为系统可能很快杀掉进程
    LocationManager.stopTracking();
  }

  // 5. 窗口销毁阶段:UI 界面销毁(但 Ability 实例可能还在)
  onWindowStageDestroy(): void {
    console.info('EntryAbility onWindowStageDestroy');
  }

  // 6. 销毁阶段:Ability 实例彻底销毁(最后一个回调)
  onDestroy(): void {
    console.info('EntryAbility onDestroy');
    // 保存关键数据到持久化存储(Preferences/数据库)
    // 从 API 13 开始,一键清理不会触发此回调(有实况窗的应用除外)
  }
  
  // 7. 热启动复用:Ability 已存在,被再次拉起时触发
  onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    console.info('EntryAbility onNewWant');
    // 处理路由跳转逻辑,例如从通知点击跳转到特定页面
    if (want.parameters?.targetPage) {
      router.pushUrl({ url: want.parameters.targetPage as string });
    }
  }
}

关键执行时序图

用户启动应用:
onCreate → onWindowStageCreate → onForeground → [前台运行]

用户按 Home 键/跳转到其他应用:
onBackground → [后台运行(可能被系统回收)]

用户重新点击应用图标:
onNewWant(如果实例还在)→ onForeground → [前台运行]

用户关闭应用或系统回收:
onWindowStageDestroy → onDestroy

关于后台启动的特殊场景

当使用 startAbilityByCall()后台启动 UIAbility 时(如推送服务触达),生命周期跳过 UI 阶段

// 后台启动流程:
onCreate()onBackground()  // 无 onWindowStageCreate,无 UI

// 用户后续手动切换到前台:
onNewWant()onWindowStageCreate()onForeground()

二、自定义组件生命周期(ArkUI 层)

在 UIAbility 加载的页面内部,ArkUI 组件(@Component/@ComponentV2)有自己的微观生命周期。

V1 装饰器体系

@Entry  // 标记为页面级组件(对应一个 Ability 页面)
@Component
struct Index {
  
  // 1. 构建阶段:组件首次渲染前(无返回值,不能声明为 async)
  aboutToAppear() {
    console.info('Index aboutToAppear');
    // 初始化状态变量、请求网络数据
    this.loadData();
  }
  
  // 2. 页面显示阶段:仅 @Entry 组件有,Ability 的 onForeground 之后
  onPageShow() {
    console.info('Index onPageShow');
    // 每次页面可见时触发(包括从其他页面返回)
  }

  // 3. 构建 UI:必须实现,用于声明 UI 结构
  build() {
    Column() {
      Text('Hello')
    }
  }
  
  // 4. 页面隐藏阶段:仅 @Entry 组件有,Ability 的 onBackground 之前
  onPageHide() {
    console.info('Index onPageHide');
  }
  
  // 5. 组件销毁前:释放资源、取消订阅、清除定时器
  aboutToDisappear() {
    console.info('Index aboutToDisappear');
  }
}

V2 装饰器体系(API 11+)

V2 对生命周期做了更精细的拆分和类型安全增强:

@ComponentV2
struct MyComponent {
  @Local message: string = '';
  
  // V2 生命周期:build 之前触发
  aboutToAppear(): void {
    // 初始化逻辑
  }
  
  // V2 新增:组件首次布局完成后(DOM 挂载完成)
  onDidBuild(): void {
    // 可以在这里获取组件的实际尺寸、执行测量等操作
    console.info('Build completed, component is in layout');
  }
  
  // 销毁前
  aboutToDisappear(): void {
    // 清理逻辑
  }
}

V2 特有注意:V2 组件不支持 onPageShow/onPageHide,需要通过 AbilityLifecycleCallback 或父组件传递状态来感知页面生命周期。


三、生命周期层级关系与数据流向

理解**系统层(Ability)UI 层(ArkUI)**的嵌套关系:

系统层 UIAbility                  UI 层 ArkUI 组件
├─ onCreate                       
│   └─ onWindowStageCreate        
│       └─ [加载页面]              
│           ├─ @Entry aboutToAppear
│           ├─ @Entry onPageShow   ←→  onForeground (几乎同时)
│           │   └─ 子组件 aboutToAppear
│           │       └─ 子组件 build
│           └─ @Entry build
│
├─ onNewWant (热启动)             
│   └─ [可能加载新页面]            
│       └─ 新页面 aboutToAppear
├─ onBackground                    ←→  onPageHide (先)
│                                   
└─ onWindowStageDestroy           
    └─ onDestroy                    ←→  aboutToDisappear (子组件先,父组件后)

数据恢复最佳实践

// Ability 层保存全局状态
onBackground() {
  // 临时保存到 AppStorage(内存)或 Preferences(持久化)
  AppStorage.set('draftContent', this.draft);
}

onDestroy() {
  // 强制持久化
  preference.putSync('key', this.criticalData);
}

// 组件层恢复视图状态
@Entry
@Component
struct EditorPage {
  @State content: string = '';
  
  aboutToAppear() {
    // 从 Ability 恢复的数据回填
    const savedDraft = AppStorage.get<string>('draftContent');
    if (savedDraft) {
      this.content = savedDraft;
    }
  }
}

四、避坑指南

1. onDestroy 不可靠(API 13+ 限制)

从 API version 13 开始,用户从最近任务列表一键清理应用时:

  • **有实况窗(Live View)**的应用:正常触发 onDestroy
  • 无实况窗的应用:进程被直接终止,不触发 onDestroy

应对:关键数据必须在 onBackground() 或实时保存(自动保存草稿机制),不能依赖 onDestroy

2. 耗时操作禁区

  • onBackground():执行时间极短,不能保存大文件或同步数据库事务
  • aboutToAppear():阻塞会导致首帧绘制延迟,显示白屏
// ❌ 错误:阻塞主线程
aboutToAppear() {
  const data = http.requestSync('https://api.example.com/data'); // 同步请求!
  this.list = data;
}

// ✅ 正确:异步加载
async aboutToAppear() {
  const data = await http.request('https://api.example.com/data');
  this.list = data; // ArkUI 会自动触发刷新
}

3. 后台启动无 UI 陷阱

后台启动的 Ability 直接处于 onBackground 状态,此时尝试操作 UI(如弹 Toast)会失败,必须在 onForeground 后执行 UI 操作。


五、总结对照表

场景 Ability 回调 组件回调 推荐操作
初始化 onCreate aboutToAppear 轻量级初始化,异步加载数据
可见交互 onForeground onPageShow 开启定位、恢复动画、抢焦
完全隐藏 onBackground onPageHide 暂停动画、释放传感器、草稿保存
彻底销毁 onDestroy aboutToDisappear 最终资源清理(不可靠)
页面复用 onNewWant 重新 aboutToAppear 路由解析、参数更新
Logo

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

更多推荐