首页 > 编程笔记 > 通用技能 阅读:2

鸿蒙UlAbility组件的3种启动模式(非常详细)

UIAbility 的启动模式是指 UIAbility 实例在启动时的不同呈现状态。

针对不同的业务场景,系统提供了 3 种启动模式,分别是 singleton、multiton 和 specified。接下来分别介绍这3种模式。

UIAbility singleton启动模式

singleton 启动模式为单实例模式,也是默认情况下的启动模式。任务列表中只会存在一个 UIAbility,回退到后台运行时不会重新创建实例。

使用 singleton 启动模式的方法是,在 module.json5 配置文件中有一个 launchType 字段,将其配置为 singleton 即可,如下图所示。


图 1 将launchType字段配置为singleton

接下来进行如下操作来观察 singleton 启动模式的特点:

图 2 观察singleton启动模式的特点

通过图 2 所示的运行结果可以得出以下结论:

UIAbility multiton启动模式

multiton启动模式为多实例模式,任务列表中会看到多个UIAbility实例。

使用 multiton 启动模式的方法是,配置多实例启动模式和配置单实例启动模式是一样的,只不过需要将配置的值换成 multiton。

接下来进行如下操作来观察 multiton 启动模式的特点:

图 3 观察multiton启动模式的特点

通过图 3 所示的运行结果可以得出以下结论:

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 的生命周期中获取。

相关文章