UIAbility的生命周期有哪些?

UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态,如下图所示。

Create状态

Create状态为在应用加载过程中,UIAbility实例创建完成时触发,系统会调用onCreate()回调。可以在该回调中进行页面初始化操作,例如变量定义资源加载等,用于后续的UI展示。

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

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // 页面初始化
  }
  // ...
}

说明

Want是对象间信息传递的载体,可以用于应用组件间的信息传递。Want的详细介绍请参见信息传递载体Want

WindowStageCreate和WindowStageDestroy状态

UIAbility实例创建完成之后,在进入Foreground之前,系统会创建一个WindowStage。WindowStage创建完成后会进入onWindowStageCreate()回调,可以在该回调中设置UI加载、设置WindowStage的事件订阅。

图2 WindowStageCreate和WindowStageDestroy状态

在onWindowStageCreate()回调中通过loadContent()方法设置应用要加载的页面,并根据需要调用on('windowStageEvent')方法订阅WindowStage的事件(获焦/失焦、切到前台/切到后台、前台可交互/前台不可交互)。

说明

不同开发场景下WindowStage事件的时序可能存在差异。

import { UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { hilog } from '@kit.PerformanceAnalysisKit';

const TAG: string = '[EntryAbility]';
const DOMAIN_NUMBER: number = 0xFF00;

export default class EntryAbility extends UIAbility {
  // ...
  onWindowStageCreate(windowStage: window.WindowStage): void {
    // 设置WindowStage的事件订阅(获焦/失焦、切到前台/切到后台、前台可交互/前台不可交互)
    try {
      windowStage.on('windowStageEvent', (data) => {
        let stageEventType: window.WindowStageEventType = data;
        switch (stageEventType) {
          case window.WindowStageEventType.SHOWN: // 切到前台
            hilog.info(DOMAIN_NUMBER, TAG, `windowStage foreground.`);
            break;
          case window.WindowStageEventType.ACTIVE: // 获焦状态
            hilog.info(DOMAIN_NUMBER, TAG, `windowStage active.`);
            break;
          case window.WindowStageEventType.INACTIVE: // 失焦状态
            hilog.info(DOMAIN_NUMBER, TAG, `windowStage inactive.`);
            break;
          case window.WindowStageEventType.HIDDEN: // 切到后台
            hilog.info(DOMAIN_NUMBER, TAG, `windowStage background.`);
            break;
          case window.WindowStageEventType.RESUMED: // 前台可交互状态
            hilog.info(DOMAIN_NUMBER, TAG, `windowStage resumed.`);
            break;
          case window.WindowStageEventType.PAUSED: // 前台不可交互状态
            hilog.info(DOMAIN_NUMBER, TAG, `windowStage paused.`);
            break;
          default:
            break;
        }
      });
    } catch (exception) {
      hilog.error(DOMAIN_NUMBER, TAG,
        `Failed to enable the listener for window stage event changes. Cause: ${JSON.stringify(exception)}`);
    }
    hilog.info(DOMAIN_NUMBER, TAG, `%{public}s`, `Ability onWindowStageCreate`);
    // 设置UI加载
    windowStage.loadContent('pages/Index', (err, data) => {
      // ...
    });
  }
}

对应于onWindowStageCreate()回调。在UIAbility实例销毁之前,则会先进入onWindowStageDestroy()回调,可以在该回调中释放UI资源。

import { UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';

const TAG: string = '[EntryAbility]';
const DOMAIN_NUMBER: number = 0xFF00;

export default class EntryAbility extends UIAbility {
  windowStage: window.WindowStage | undefined = undefined;

  // ...
  onWindowStageCreate(windowStage: window.WindowStage): void {
    this.windowStage = windowStage;
    // ...
  }

  onWindowStageDestroy() {
    // 释放UI资源
    // 例如在onWindowStageDestroy()中注销WindowStage事件订阅(获焦/失焦、切到前台/切到后台、前台可交互/前台不可交互)
    try {
      if (this.windowStage) {
        this.windowStage.off('windowStageEvent');
      }
    } catch (err) {
      let code = (err as BusinessError).code;
      let message = (err as BusinessError).message;
      hilog.error(DOMAIN_NUMBER, TAG, `Failed to disable the listener for windowStageEvent. Code is ${code}, message is ${message}`);
    }
  }
}

WindowStageWillDestroy状态

对应onWindowStageWillDestroy()回调,在WindowStage销毁前执行,此时WindowStage可以使用。

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

export default class EntryAbility extends UIAbility {
  windowStage: window.WindowStage | undefined = undefined;
  // ...
  onWindowStageCreate(windowStage: window.WindowStage): void {
    this.windowStage = windowStage;
    // ...
  }
  onWindowStageWillDestroy(windowStage: window.WindowStage) {
    // 释放通过windowStage对象获取的资源
  }
  onWindowStageDestroy() {
    // 释放UI资源
  }
}

Foreground和Background状态

Foreground和Background状态分别在UIAbility实例切换至前台和切换至后台时触发,对应于onForeground()回调和onBackground()回调。

onForeground()回调,在UIAbility的UI可见之前,如UIAbility切换至前台时触发。可以在onForeground()回调中申请系统需要的资源,或者重新申请在onBackground()中释放的资源。

onBackground()回调,在UIAbility的UI完全不可见之后,如UIAbility切换至后台时候触发。可以在onBackground()回调中释放UI不可见时无用的资源,或者在此回调中执行较为耗时的操作,例如状态保存等。

例如应用在使用过程中需要使用用户定位时,假设应用已获得用户的定位权限授权。在UI显示之前,可以在onForeground()回调中开启定位功能,从而获取到当前的位置信息。

当应用切换到后台状态,可以在onBackground()回调中停止定位功能,以节省系统的资源消耗。

import { UIAbility } from '@kit.AbilityKit';

export default class EntryAbility extends UIAbility {
  // ...

  onForeground(): void {
    // 申请系统需要的资源,或者重新申请在onBackground()中释放的资源
  }

  onBackground(): void {
    // 释放UI不可见时无用的资源,或者在此回调中执行较为耗时的操作
    // 例如状态保存等
  }
}

当应用的UIAbility实例已创建,且UIAbility配置为singleton启动模式时,再次调用startAbility()方法启动该UIAbility实例时,只会进入该UIAbility的onNewWant()回调,不会进入其onCreate()onWindowStageCreate()生命周期回调。应用可以在该回调中更新要加载的资源和数据等,用于后续的UI展示。

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

export default class EntryAbility extends UIAbility {
  // ...

  onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam) {
    // 更新资源、数据
  }
}

Destroy状态

Destroy状态在UIAbility实例销毁时触发。可以在onDestroy()回调中进行系统资源的释放、数据的保存等操作。

例如,调用terminateSelf()方法停止当前UIAbility实例,执行onDestroy()回调,并完成UIAbility实例的销毁。

import { UIAbility } from '@kit.AbilityKit';

export default class EntryAbility extends UIAbility {
  // ...

  onDestroy() {
    // 系统资源的释放、数据的保存等
  }
}

<think>好的,我现在要回答用户关于HarmonyOS应用或组件生命周期的问题。首先,我需要明确用户具体想了解的是哪个模型的生命周期,因为根据引用[2],HarmonyOS有FA模型和Stage模型两种,而Stage模型是目前主推的。所以可能用户需要了解的是Stage模型下的生命周期。 接下来,我需要从提供的引用中查找相关信息。引用[2]提到Stage模型中的应用组件和窗口通过AbilityStage、WindowStage等类管理。引用[3]提到Ability Kit,可能包含生命周期的相关内容。引用[4]中虽然没有直接讲生命周期,但提到了页面的生命周期,这可能与组件的生命周期有关。 然后,我需要整理Stage模型中应用组件的生命周期。通常,生命周期包括创建、启动、激活、暂停、恢复、停止、销毁等阶段。在Stage模型中,AbilityStage是应用进程的入口,每个HAP加载时都会创建AbilityStage实例。每个Ability(如UIAbility)有自己的生命周期回调,比如onCreate、onWindowStageCreate、onForeground、onBackground、onWindowStageDestroy、onDestroy等。 另外,需要区分应用级和组件级的生命周期。应用级可能涉及整个应用进程的生命周期管理,而组件级如UIAbility、ExtensionAbility等各有不同的回调。引用[3]中的Ability Kit详解应该提供了这些内容,可能需要结合具体的类和方法来说明。 还要注意引用[4]中的页面生命周期,这可能指的是ArkUI中的页面组件,如Page组件的onPageShow、onPageHide等,这部分属于UI组件的生命周期,与应用组件的生命周期不同层次,需要分开说明。 最后,需要确保回答结构清晰,分点讲解Stage模型的应用生命周期、Ability生命周期、页面生命周期,并引用相关的资料。同时,生成的相关问题要围绕生命周期模型、对比FA模型、具体回调方法的作用等展开。</think>### HarmonyOS应用/组件生命周期详解 在HarmonyOS中,应用和组件的生命周期管理因**应用模型**不同而有所差异。当前主推的**Stage模型**采用模块化设计,其生命周期管理分为以下三个层级: --- #### 一、应用级生命周期(AbilityStage) **AbilityStage**是Stage模型中应用进程的入口,每个HAP(Harmony Ability Package)加载时都会创建其实例。核心方法包括: - `onCreate()`:HAP首次加载时触发,用于初始化全局资源[^2][^3]。 - `onAcceptWant()`:决定是否允许其他应用通过Want启动本应用的能力[^3]。 --- #### 二、组件级生命周期UIAbility) 每个**UIAbility**实例对应一个独立的应用窗口,其生命周期回调如下: 1. **`onCreate()`** Ability实例创建时触发,用于初始化必要资源(*注意此时未关联窗口*)。 2. **`onWindowStageCreate(windowStage: WindowStage)`** 窗口创建阶段,需在此方法中加载UI界面: ```typescript onWindowStageCreate(windowStage: WindowStage) { windowStage.loadContent('pages/Index', (err) => { if (err.code) { // 错误处理 } }); } ``` 3. **`onForeground()`** 应用进入前台时触发(如从后台恢复),用于恢复暂停的操作。 4. **`onBackground()`** 应用进入后台时触发(如用户切换应用),需在此释放非必要资源。 5. **`onWindowStageDestroy()`** 窗口销毁时触发,需进行界面资源释放。 6. **`onDestroy()`** Ability实例销毁前触发,进行最终资源清理。 --- #### 三、页面级生命周期(ArkUI) 在UI组件层面,**ArkUI页面**的生命周期方法包括: - `aboutToAppear()`:页面即将显示时触发 - `onPageShow()`:页面完全显示时触发 - `onPageHide()`:页面隐藏时触发 - `aboutToDisappear()`:页面即将销毁时触发[^4] ```typescript @Entry @Component struct Index { aboutToAppear() { console.log('页面即将创建'); } onPageShow() { console.log('页面已显示'); } } ``` --- ### Stage与FA模型对比 | 特性 | Stage模型 | FA模型(已废弃) | |--------------------|-----------------------------------|---------------------------| | 生命周期管理 | 通过AbilityStage集中管理 | 分散在Ability中管理 | | 窗口创建方式 | 显式调用loadContent() | 自动创建窗口 | | 多实例支持 | 支持同一Ability多实例 | 仅支持单实例 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值