鸿蒙UlAbility组件的3种启动模式(非常详细)
UIAbility 的启动模式是指 UIAbility 实例在启动时的不同呈现状态。
针对不同的业务场景,系统提供了 3 种启动模式,分别是 singleton、multiton 和 specified。接下来分别介绍这3种模式。
使用 singleton 启动模式的方法是,在 module.json5 配置文件中有一个 launchType 字段,将其配置为 singleton 即可,如下图所示。

图 1 将launchType字段配置为singleton
接下来进行如下操作来观察 singleton 启动模式的特点:

图 2 观察singleton启动模式的特点
通过图 2 所示的运行结果可以得出以下结论:
使用 multiton 启动模式的方法是,配置多实例启动模式和配置单实例启动模式是一样的,只不过需要将配置的值换成 multiton。
接下来进行如下操作来观察 multiton 启动模式的特点:

图 3 观察multiton启动模式的特点
通过图 3 所示的运行结果可以得出以下结论:
specified 启动模式的每个 UIAbility 实例可以设置 key(传递参数)标识,启动 UIAbility 时,需要指定 key,存在相同实例则直接被拉起(即启动),若不存在则会创建新的实例。
specified 模式的实例相对于其他几个实例更复杂,涉及的知识点也比较多,需要仔细阅读下面的示例代码。

图 4 创建一个新的Ability
通过观察可以发现新创建的 Ability 文件与 EntryAbility 文件里面的内容是一致的,但是需要将新创建的 Ability 文件下的加载页面修改成我们想要让其启动的入口文件才可以。

图 5 在Page文件下创建一个新的页面
在 twoAbility 文件的加载页面中配置我们创建的 newPage 页面,如下图所示。

图 6 配置newPage页面
到目前为止,Ability 就已经配置完成了。同时我们可以观察一下 module.json5,在该文件中,编辑器自动生成了一个对象,就是我们创建的 Ability 相关信息,可以在这个 Ability 中设置启动模式为 specified,如下图所示:

图 7 Ability配置完成并设置启动模式为specified
① 获取上下文对象:
② 配置 want:
③ 利用 context 的 startAbility 来调起 UIAbility:
完整代码如下:

图 8 效果展示
自定义传递的参数 parameters 可以在 Ability 的生命周期中获取。
针对不同的业务场景,系统提供了 3 种启动模式,分别是 singleton、multiton 和 specified。接下来分别介绍这3种模式。
UIAbility singleton启动模式
singleton 启动模式为单实例模式,也是默认情况下的启动模式。任务列表中只会存在一个 UIAbility,回退到后台运行时不会重新创建实例。使用 singleton 启动模式的方法是,在 module.json5 配置文件中有一个 launchType 字段,将其配置为 singleton 即可,如下图所示。

图 1 将launchType字段配置为singleton
接下来进行如下操作来观察 singleton 启动模式的特点:
- 启动应用;
- 将应用置于后台运行;
- 再次打开应用;
- 观察应用列表以及生命周期的变化,如下图所示:

图 2 观察singleton启动模式的特点
通过图 2 所示的运行结果可以得出以下结论:
- 当应用从后台再次打开时,不会触发 onCreate 状态;
- 任务列表中永远只有一个实例。
UIAbility multiton启动模式
multiton启动模式为多实例模式,任务列表中会看到多个UIAbility实例。使用 multiton 启动模式的方法是,配置多实例启动模式和配置单实例启动模式是一样的,只不过需要将配置的值换成 multiton。
接下来进行如下操作来观察 multiton 启动模式的特点:
- 启动应用;
- 将应用置于后台运行;
- 再次打开应用;
- 观察应用列表以及生命周期的变化,如下图所示。

图 3 观察multiton启动模式的特点
通过图 3 所示的运行结果可以得出以下结论:
- 当应用从后台再次打开时,会再次触发 onCreate 状态;
- 任务列表中会创建多个实例。
UIAbility specified启动模式
specified 启动模式为指定实例模式,针对一些特殊场景使用,例如在文档应用中,每次新建文档都希望能新建一个文档实例,重复打开一个已保存的文档希望打开的都是同一个文档实例。specified 启动模式的每个 UIAbility 实例可以设置 key(传递参数)标识,启动 UIAbility 时,需要指定 key,存在相同实例则直接被拉起(即启动),若不存在则会创建新的实例。
specified 模式的实例相对于其他几个实例更复杂,涉及的知识点也比较多,需要仔细阅读下面的示例代码。
配置Ability并设置启动模式
下面先配置 Ability,并将启动模式设置为 specified,然后进行功能开发。具体步骤如下:1) 创建Ability
创建一个新的 Ability,用于新场景的拉起,具体操作如下图所示。
图 4 创建一个新的Ability
通过观察可以发现新创建的 Ability 文件与 EntryAbility 文件里面的内容是一致的,但是需要将新创建的 Ability 文件下的加载页面修改成我们想要让其启动的入口文件才可以。
2) 新建加载页面
如下图所示,在 Page 文件下创建一个新的页面,并命名为 newPage:
图 5 在Page文件下创建一个新的页面
在 twoAbility 文件的加载页面中配置我们创建的 newPage 页面,如下图所示。

图 6 配置newPage页面
到目前为止,Ability 就已经配置完成了。同时我们可以观察一下 module.json5,在该文件中,编辑器自动生成了一个对象,就是我们创建的 Ability 相关信息,可以在这个 Ability 中设置启动模式为 specified,如下图所示:

图 7 Ability配置完成并设置启动模式为specified
3) 功能开发
前期工作准备完成了,接下来就可以进行功能开发。4) 需求分析
单击“唤起另一个 UIAbility”按钮,打开 newPage 页面。5) 实现分析
要实现从一个 UIAbility 唤起另一个 UIAbility,主要有 3 个步骤:① 获取上下文对象:
private context = getContext(this) as common.UIAbilityContext在 Index.ets 页面中定义一个 context 上下文对象,通过 getContext 方法获取上下文并进行类型强制转换。
② 配置 want:
// 准备want(参数信息) let want:Want ={ deviceId:'', // 设备ID,为空指的是当前设备 bundleName: 'com.example.specified' , // 包名,在app.json5 中 moduleName:'entry' , // 模块名 abilityName:'twoAbility' , // 跳转的ability名称,是我们在module.json5中创建的ability名称 parameters:{ // 自定义传递的参数 info:'来自entryAbility' } }
③ 利用 context 的 startAbility 来调起 UIAbility:
// 利用context的 startAbility 来调起UIAbility this.context.startAbility(want)到目前为止我们就配置完成了。
完整代码如下:
import { common, Want } from '@kit.AbilityKit'; @Entry @Component struct Index { @State message: string = '首页'; // 获取上下文对象 private context = getContext(this) as common.UIAbilityContext build() { Row() { Column() { Text(this.message) .fontSize(50) .fontWeight(FontWeight.Bold) Button('唤起另一个 UIAbility').onClick(() => { // 准备want(参数信息) let want: Want = { deviceId: '', // 设备ID,为空指的是当前设备 bundleName: 'com.example.specified', // 包名,在app.json5 中 moduleName: 'entry', // 模块名 abilityName: 'twoAbility', // 跳转的ability名称,是我们在module.json5中创建的ability名称 parameters: { info: '来自entryAbility' } // 自定义传递的参数 } // 利用context的startAbility 来调起UIAbility this.context.startAbility(want) }) } } .width('100%') .height('100%') } }效果如下图所示:

图 8 效果展示
自定义传递的参数 parameters 可以在 Ability 的生命周期中获取。