【HarmonyOS】Stage 模型 - UIAbility 的启动模式

Stage 模型这样的应用,它在启动的时候会先准备 Ability Stage 舞台,接着呢,就可以基于它去创建 UIAbility 的实例,并去启动它。

UIAbility 组件启动模式 有四种:

  • singleton
  • standard
  • multiton
  • specified

修改模块的 module.json5 来改变启动模式:

{
  "module": {
    ...

    "abilities": [
      {
        ...

        "launchType": "singleton",
        
        ...
      }
    ]
  }
}

一、singleton 启动模式

👉 官方文档

singleton 是单实例的意思,所以这种模式对应的 UIAbility 不管你给它启动多少次,它只会存在唯一的实例。事实上,我们的应用默认 Ability 都是这种模式。

UIAbility 的实例其实对应到操作系统任务列表中的一个任务。所以,如果你的 Ability 是 singleton 这种模式,不管启动多少次,去查看手机的任务列表,会发现这个 Ability 在任务列表中只会存在一个任务。


运行日志:

  1. 点击图标启动 app:

    Ability onCreate
    Ability onWindowStageCreate
    Ability onForeground
    
  2. 点击 Home 回到桌面:

    Ability onBackground
    
  3. 再次点击图标启动 app:

    Ability onForeground
    

二、standard、multiton 启动模式

👉 官方文档

在官网上管 standard 模式叫 multiton 模式,但是经过测试,这两种模式是不一样的。但是这两个模式又非常接近,这两种模式在每次启动 UIAbility 时都会创建一个新实例。

在 standard 模式当中,创建一个新的实例,之前那个旧的实例也会存在,也就是多个实例并存;而 multiton 模式则不一样,它在每次创建一个新实例,旧的实例则会被移除。

对于 standard 模式来讲,每创建一个新的实例,都会存在,那是不是意味着同一个 Ability 它的多个实例是并存的。因此在任务列表中会发现一个 Ability 可能会存在一个或多个任务。


multiton 运行日志:

  1. 点击图标启动 app:

    Ability onCreate
    Ability onWindowStageCreate
    Ability onForeground
    
  2. 点击 Home 回到桌面:

    Ability onBackground
    
  3. 再次点击图标启动 app:

    Ability onCreate
    Ability onWindowStageCreate
    Ability onForeground
    
  4. 点击任务列表

    发现 App 只存在一个实例
    

standard 运行日志:

  1. 点击图标启动 app:

    Ability onCreate
    Ability onWindowStageCreate
    Ability onForeground
    
  2. 点击 Home 回到桌面:

    Ability onBackground
    
  3. 再次点击图标启动 app:

    Ability onCreate
    Ability onWindowStageCreate
    Ability onForeground
    
  4. 点击任务列表

    发现 App 存在两个实例
    

三、specified 启动模式

👉 官方文档

specified 顾名思义就是指定的意思,在使用这种模式时,启动一个 UIAbility 时是需要指定一个 key,这个 key 会作为 UIAbility 实例的一个唯一标识。

所以,当启动时,会先看一下指定的这个 key 对应的 UIAbility 是否存在。如果不存在,就会创建一个新的 UIAbility 实例,然后把这个 key 作为这个实例的标识,下次再启动 UIAbility 时,还需要指定 key,还需要判断这个 key 对应的实例是否已经存在。如果已经存在,就可以直接把它唤醒,不用重新创建。

这种模式和 standard 模式有点像,就是一个 Ability 会存在多个实例,但是呢又不一样,在创建实例时可以指定 key,key 不存在才需要创建,key 存在就不用重复创建了,这样就可以快速的找到以前创建好的实例。

当前 UIAbility 调用 startAbility 方法拉起目标 UIAbility:

// 获取上下文
context = getContext(this) as common.UIAbilityContext

// 指定要跳转到 UIAbility 的信息
let want = {
    deviceId: '',
    bundleName: 'com.tyhoo.hmos.myapplication',
    abilityName: 'TestAbility',
    moduleName: 'entry',
    parameters: {
      instanceKey: this.getInstanceKey()
    }
}

// 尝试拉起目标 UIAbility 实例
this.context.startAbility(want)
  • 调用一个全局的 getContext 方法,来获取 UIAbilityContext 的上下文对象。

  • 拿到上下文之后,可以调用它的 startAbility 方法,从而来去拉起一个目标的 UIAbility,或者说把它的实例给创建好。

  • 传入参数 want 来告诉具体拉起哪个实例。

    • deviceId:设备信息。如果什么都不传,代表的是本设备。
    • bundleName:包名/应用名。它是设备的唯一标识。
    • abilityName:目标 UIAbility 的名称。
    • moduleName:模块名。调用的 Ability 在哪个模块。
    • parameters:参数。

在 AbilityStage 的生命周期回调中为目标 UIAbility 实例生成 key:

export default class MyAbilityStage extends AbilityStage {
  onAcceptWant(want: Want): string {
    if (want.abilityName === 'TestAbility') {
      return `TestAbility_${want.parameters.instanceKey}`
    }
    return '';
  }
}

在 module.json5 配置文件中,通过 srcEntry 参数指定 AbilityStage 路径:

{
  "module": {
    ...

    "srcEntry": "./ets/myabilitystage/MyAbilityStage.ts"
  }
}
<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
发出的红包

打赏作者

Tyhoo Wu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值