我来查看官方文档中关于 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 回调组件回调推荐操作
初始化onCreateaboutToAppear轻量级初始化,异步加载数据
可见交互onForegroundonPageShow开启定位、恢复动画、抢焦
完全隐藏onBackgroundonPageHide暂停动画、释放传感器、草稿保存
彻底销毁onDestroyaboutToDisappear最终资源清理(不可靠)
页面复用onNewWant重新 aboutToAppear路由解析、参数更新
Logo

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

更多推荐