在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中棧的狀態。
現在假設Page Ability1的launchType屬性值是standard,那么從Page Ability1中啟動Page Ability1,如果啟動2次,就會再創建兩個Page Ability1實例,這時棧的狀態如圖2所示。
很明顯,在棧中有3個Page Ability1實例。
如果Page Ability1的launchType屬性值是singleton,那么不管顯示多少次Page Ability1,在棧中永遠只有1個Page Ability1實例。所以如果想讓某一個Page Ability1永遠只有一個實例的時候,可以將該Page Ability的launchType屬性值設為singleton。
下面通過一個案例來演示standard和singleton的區別。
首先創建一個名為LaunchTypeAbility的Page Ability,并編寫下面的代碼:
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);
super.setUIContent(ResourceTable.Layout_launch_type_layout);
count++;
Text text = (Text)findComponentById(ResourceTable.Id_text);
if(text != null) {
text.setText(String.valueOf(count));
}
Button buttonStartAbility = (Button)findComponentById(ResourceTable.Id_button_start_ability);
if(buttonStartAbility != null) {
buttonStartAbility.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
Intent intent = new Intent();
intent.setAction(“action.harmonyos.demo.ability.testlaunchtype”);
// 顯示另外一個Page Ability
startAbility(intent);
}
});
}
}
}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.
復制在config.json文件中配置LaunchTypeAbility,代碼如下:
{
“skills”: [
{
“actions”: [
“action.harmonyos.demo.ability.launchtype”
]
}
],
“orientation”: “landscape”,
“formEnabled”: false,
“name”: “com.unitymarvel.demo.ability.LaunchTypeAbility”,
“icon”: “$media:icon”,
“label”: “Page Ability的啟動類型”,
“type”: “page”,
“launchType”: “standard”
}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.
復制這里將LaunchTypeAbility的launchType屬性值設為standard。
然后再創建另外一個名為TestLaunchTypeAbility的Page Ability,代碼如下:
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 TestLaunchTypeAbility extends Ability {
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_launch_type_layout);
Button buttonStartAbility =
(Button)findComponentById(ResourceTable.Id_button_start_ability);
if(buttonStartAbility != null) {
buttonStartAbility.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
Intent intent = new Intent();
intent.setAction(“action.harmonyos.demo.ability.launchtype”);
// 顯示LaunchTypeAbility
startAbility(intent);
}
});
}
}
}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.
復制本例包含兩個Page Ability:LaunchTypeAbility和TestLaunchTypeAbility。目前這兩個Page Ability的launchType屬性值都是standard。這兩個Page Ability的關系是LaunchTypeAbility顯示TestLaunchTypeAbility,然后TestLaunchTypeAbility再顯示LaunchTypeAbility,如圖3所示。
在LaunchTypeAbility類中有一個靜態變量count,如果每次顯示LaunchTypeAbility時都創建一個新的實例,那么count會不斷加1,例如,如果顯示3次LaunchTypeAbility,應該看到如圖4所示的窗口。
如果將LaunchTypeAbility的launchType屬性值改成singleton,那么不管顯示多少次LaunchTypeAbility,計數器count的值永遠是1,如圖5所示。因為LaunchTypeAbility在創建一個實例后,就不會再創建新的LaunchTypeAbility實例了,所以onStart方法自然就不會再次調用了。
編輯:hfy
-
鴻蒙系統
+關注
關注
183文章
2634瀏覽量
66221
發布評論請先 登錄
相關推薦
評論