Ability的LaunchType 揭秘鸿蒙Page 一文解析 (ability)

简介

在 PageAbility 的配置信息(config.json 文件)中有一个 launchType 属性,通过模板默认生成的值是 standard,这是 launchType 属性的默认值(可以不设置 launchType,这样默认值就是 standard)。launchType 属性的另外一个可以设置的值是 singleton。这两个属性值的区别如下: standard:在任何情况下,无论 PageAbility 被显示多少次,都会创建一个新的 PageAbility 实例; singleton:如果要显示的 PageAbility 在栈顶,那么再次显示这个 PageAbility 时,不会再创建新的 PageAbility 实例,而是直接使用这个 PageAbility 实例。如果 PageAbility 上面有其他的 PageAbility,那么首先弹出这些 PageAbility,然后再重用这个 PageAbility。拥有 singleton 模式的 PageAbility 将永远使用唯一的实例;这里涉及到一个栈的概念,这是管理 PageAbility 的模式。

栈的概念

HarmonyOS App 同时只能显示一个 PageAbility,那么哪一个 PageAbility 才能显示呢?HarmonyOS App 会使用一个栈来管理 App 中所有的 PageAbility,只有在栈顶的 PageAbility 才会显示。如果要想让栈中第 2 个 PageAbility 显示,那么栈顶的 PageAbility 就必须出栈,也就是销毁 PageAbility,也就是调用 terminateAbility 方法要完成的工作。 下面用图示来说明这一过程。
栈管理
图 1 中每一个矩形区域表示 App 中当前用于保存 PageAbility 的栈。图 1 中只有一个 PageAbility1,如果让 PageAbility2 显示,那么 PageAbility2 必须压栈,PageAbility3 显示也需要完成同样的工作。在图 3 的状态中,如果让 PageAbility2 显示,那么 PageAbility3 必须出栈,就形成了图 4 中栈的状态。

standard 和 singleton 的区别

现在假设 PageAbility1 的 launchType 属性值为 standard,那么从 PageAbility1 中启动 PageAbility1,如果启动 2 次,就会再创建两个 PageAbility1 实例,这时栈的状态如图 2 所示。很明显,在栈中有 3 个 PageAbility1 实例。
具有 standard launchType 的栈
如果 PageAbility1 的 launchType 属性值为 singleton,那么不管显示多少次 PageAbility1,在栈中永远只有 1 个 PageAbility1 实例。
具有 singleton launchType 的栈
所以如果想让某一个 PageAbility1 永远只有一个实例的时候,可以将该 PageAbility 的 launchType 属性值设为 singleton。

案例展示

下面通过一个案例来展示 standard 和 singleton 的区别。首先创建一个名为 LaunchTypeAbility 的 PageAbility,并编写下面的代码: ``` package com.unitymarvel.demo.ability; import com.unitymarvel.demo.ResourceTable; import ohos.aafwk.ability.Ability; import ohos.aafwk.content.Intent; import ohos.agp.components.Button; import ohos.agp.components.Component; import ohos.agp.components.Text; public class LaunchTypeAbility extends Ability { private static int count = 0; // 计数器 @Override public void onStart(Intent intent) { super.onStart(intent); // 创建按钮 Button button = new Button(this); button.setText("点击我"); // 添加按钮点击事件监听器 button.setClickedListener(new Component.ClickedListener() { @Override public void onClick(Component component) { // 在标签中显示点击次数 Text text = (Text) findComponentById(ResourceTable.Id_text); text.setText("点击次数:" + ++count); } }); // 添加按钮到布局中 add(button); } } ``` 接下来,创建两个配置文件 config.json,分别设置 launchType 为 standard 和 singleton。 standard: ``` { "name": "LaunchTypeAbility", "module": "entry", "ui": "components/LaunchTypeAbility.ability", "launchType": "standard" } ``` singleton: ``` { "name": "LaunchTypeAbility", "module": "entry", "ui": "components/LaunchTypeAbility.ability", "launchType": "singleton" } ``` 最后,在 main.json 中注册这两个 PageAbility: ``` { "appId": "com.unitymarvel.demo", "appName": "LaunchType Demo", "versionName": "1.0.0", "versionCode": 10000, "appType": "APP", "pageAbilities": [ { "name": "StandardLaunchTypeAbility", "config": "config.json" }, { "name": "SingletonLaunchTypeAbility", "config": "config-singleton.json" } ] } ``` 运行 App,分别点击具有 standard launchType 和 singleton launchType 的按钮,观察文本标签中的点击次数。你会发现: 对于具有 standard launchType 的 PageAbility,每次点击都会创建一个新的实例,因此点击次数会递增; 对于具有 singleton launchType 的 PageAbility,无论点击多少次,点击次数始终保持 1,因为始终使用唯一的实例。 通过这个案例,你可以清楚地看到 launchType 属性对 PageAbility 行为的影响。

总结

launchType 属性是一个重要的属性,它决定了 PageAbility 的实例化和重用行为。在选择 standard 和 singleton 时,需要根据具体场景和需求进行权衡。 standard:适用于需要在每次显示 PageAbility 时都创建新实例的情况。 singleton:适用于需要确保 PageAbility 始终只有一个实例的情况。 希望文档能够帮助你理解 PageAbility 的 launchType 属性及其用法。

本文原创来源:电气TV网,欢迎收藏本网址,收藏不迷路哦!

相关阅读

添加新评论