在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的區別,
首先創建一個名為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);
}
});
}
}
}
在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"
}
這里將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);
}
});
}
}
}
本例包含兩個Page Ability:LaunchTypeAbility和TestLaunchTypeAbility,目前這兩個Page Ability的launchType屬性值都是standard,這兩個Page Ability的關系是LaunchTypeAbility顯示TestLaunchTypeAbility,然后TestLaunchTypeAbility再顯示LaunchTypeAbility,如圖3所示,
圖3
在LaunchTypeAbility類中有一個靜態變數count,如果每次顯示LaunchTypeAbility時都創建一個新的實體,那么count會不斷加1,例如,如果顯示3次LaunchTypeAbility,應該看到如圖4所示的視窗,
圖4
如果將LaunchTypeAbility的launchType屬性值改成singleton,那么不管顯示多少次LaunchTypeAbility,計數器count的值永遠是1,如圖5所示,因為LaunchTypeAbility在創建一個實體后,就不會再創建新的LaunchTypeAbility實體了,所以onStart方法自然就不會再次呼叫了,
圖5
- EOF -
推薦閱讀 點擊標題可跳轉
鴻蒙IDE(DevEco Studio)怎樣1秒下載Gradle
特大喜訊!鴻蒙專案來了:在線電子詞典
【喜訊、喜訊】期待已久的鴻蒙IDE macOS版終于發布了!
【直播回放】獨家傳授:成為Python高手的武功秘籍
除錯鴻蒙(HarmonyOS)App源代碼的兩種方式
開發跨設備的鴻蒙(HarmonyOS) App
鴻蒙(HarmonyOS)大神都喜歡玩命令列
關注「極客起源」公眾號,加星標,不錯過精彩技術干貨
CSDN認證博客專家
公眾號:極客起源
達芬奇
UM
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/240942.html
標籤:AI
