在 Page Ability 的配置信息(config.json 文件)中有一个 launchType 属性,通过模板默认生成的值是 standard,这是 launchType 属性的默认值(能够不设置 launchType,这样默认值就是 standard)。launchType 属性的另外一个能够设置的值是 singleton。这两个属性值的区别如下:
- standard:在任何状况下,无论 Page Ability 被显示多少次,都会创立一个新的 Page Ability 实例;
- singleton:如果要显示的 Page Ability 在栈顶,那么再次显示这个 Page Ability 时,不会再创立新的 Page Ability 实例,而是间接应用这个 Page Ability 实例。如果 Page Ability 下面有其余的 Page Ability,那么首先弹出这些 Page Ability,而后再重用这个 Page Ability。总之,领有 singleton 模式的 Page Ability 将永远应用惟一的实例;
这里波及到一个栈的概念,这是 HarmonyOS 治理 Page Ability 的模式。HarmonyOS App 同时只能显示一个 Page Ability,那么哪一个 Page Ability 能力显示呢?HarmonyOS App 会应用一个栈来治理 App 中所有的 Page Ability,只有在栈顶的 Page Ability 才会显示。如果要想让栈中第 2 个 Page Ability 显示,那么栈顶的 Page Ability 就必须出栈,也就是销毁 Page Ability,也就是调用 terminateAbility 办法要实现的工作。
上面用图示来阐明这一过程。图 1 中每一个矩形区域示意 App 中以后用于保留 Page Ability 的栈。1 中只有一个 Page Ability1,如果让 Page Ability2 显示,那么 Page Ability2 必须压栈,Page Ability3 显示也须要实现同样的工作。在 3 的状态中,如果让 Page Ability2 显示,那么 Page Ability3 必须出栈,就造成了 4 中栈的状态。
图 1
当初假如 Page Ability1 的 launchType 属性值是 standard,那么从 Page Ability1 中启动 Page Ability1,如果启动 2 次,就会再创立两个 Page Ability1 实例,这时栈的状态如图 2 所示。
图 2
很显著,在栈中有 3 个 Page Ability1 实例。
如果 Page Ability1 的 launchType 属性值是 singleton,那么不论显示多少次 Page Ability1,在栈中永远只有 1 个 Page Ability1 实例。所以如果想让某一个 Page Ability1 永远只有一个实例的时候,能够将该 Page Ability 的 launchType 属性值设为 singleton。
上面通过一个案例来演示 standard 和 singleton 的区别。