在Page Ability的配置信息(config.json文件)中有一個launchType屬性,通過模板默認(rèn)生成的值是standard,這是launchType屬性的默認(rèn)值(可以不設(shè)置launchType,這樣默認(rèn)值就是standard)。launchType屬性的另外一個可以設(shè)置的值是singleton。這兩個屬性值的區(qū)別如下:
standard:在任何情況下,無論Page Ability被顯示多少次,都會創(chuàng)建一個新的Page Ability實例;
singleton:如果要顯示的Page Ability在棧頂,那么再次顯示這個Page Ability時,不會再創(chuàng)建新的Page Ability實例,而是直接使用這個Page Ability實例。如果Page Ability上面有其他的Page Ability,那么首先彈出這些Page Ability,然后再重用這個Page Ability。總之,擁有singleton模式的Page Ability將永遠(yuǎn)使用唯一的實例;
這里涉及到一個棧的概念,這是HarmonyOS管理Page Ability的模式。HarmonyOS App同時只能顯示一個Page Ability,那么哪一個Page Ability才能顯示呢?HarmonyOS App會使用一個棧來管理App中所有的Page Ability,只有在棧頂?shù)腜age Ability才會顯示。如果要想讓棧中第2個Page Ability顯示,那么棧頂?shù)腜age Ability就必須出棧,也就是銷毀Page Ability,也就是調(diào)用terminateAbility方法要完成的工作。
下面用圖示來說明這一過程。圖1中每一個矩形區(qū)域表示App中當(dāng)前用于保存Page Ability的棧。1中只有一個Page Ability1,如果讓Page Ability2顯示,那么Page Ability2必須壓棧,Page Ability3顯示也需要完成同樣的工作。在3的狀態(tài)中,如果讓Page Ability2顯示,那么Page Ability3必須出棧,就形成了4中棧的狀態(tài)。
現(xiàn)在假設(shè)Page Ability1的launchType屬性值是standard,那么從Page Ability1中啟動Page Ability1,如果啟動2次,就會再創(chuàng)建兩個Page Ability1實例,這時棧的狀態(tài)如圖2所示。
很明顯,在棧中有3個Page Ability1實例。
如果Page Ability1的launchType屬性值是singleton,那么不管顯示多少次Page Ability1,在棧中永遠(yuǎn)只有1個Page Ability1實例。所以如果想讓某一個Page Ability1永遠(yuǎn)只有一個實例的時候,可以將該Page Ability的launchType屬性值設(shè)為singleton。
下面通過一個案例來演示standard和singleton的區(qū)別。
首先創(chuàng)建一個名為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; // 計數(shù)器
@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.
復(fù)制在config.json文件中配置LaunchTypeAbility,代碼如下:
{
“skills”: [
{
“actions”: [
“action.harmonyos.demo.ability.launchtype”
]
}
],
“orientation”: “l(fā)andscape”,
“formEnabled”: false,
“name”: “com.unitymarvel.demo.ability.LaunchTypeAbility”,
“icon”: “$media:icon”,
“l(fā)abel”: “Page Ability的啟動類型”,
“type”: “page”,
“l(fā)aunchType”: “standard”
}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.
復(fù)制這里將LaunchTypeAbility的launchType屬性值設(shè)為standard。
然后再創(chuàng)建另外一個名為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.
復(fù)制本例包含兩個Page Ability:LaunchTypeAbility和TestLaunchTypeAbility。目前這兩個Page Ability的launchType屬性值都是standard。這兩個Page Ability的關(guān)系是LaunchTypeAbility顯示TestLaunchTypeAbility,然后TestLaunchTypeAbility再顯示LaunchTypeAbility,如圖3所示。
在LaunchTypeAbility類中有一個靜態(tài)變量count,如果每次顯示LaunchTypeAbility時都創(chuàng)建一個新的實例,那么count會不斷加1,例如,如果顯示3次LaunchTypeAbility,應(yīng)該看到如圖4所示的窗口。
如果將LaunchTypeAbility的launchType屬性值改成singleton,那么不管顯示多少次LaunchTypeAbility,計數(shù)器count的值永遠(yuǎn)是1,如圖5所示。因為LaunchTypeAbility在創(chuàng)建一個實例后,就不會再創(chuàng)建新的LaunchTypeAbility實例了,所以onStart方法自然就不會再次調(diào)用了。
編輯:hfy
-
鴻蒙系統(tǒng)
+關(guān)注
關(guān)注
183文章
2642瀏覽量
68145
發(fā)布評論請先 登錄
鴻蒙開發(fā)接口Ability框架:【@ohos.application.Ability (Ability)】

鴻蒙開發(fā)接口Ability框架:【@ohos.ability.featureAbility (FeatureAbility模塊)】

鴻蒙Ability開發(fā)-Stage模型下Ability的創(chuàng)建和使用

【全球首套鴻蒙2.0教程】鴻蒙(HarmonyOS)2.0入門與實戰(zhàn)【李寧】 - 2.Ability Page
HarmonyOS應(yīng)用開發(fā)-Ability
跟阿斌一起學(xué)鴻蒙(2): Ability vs App?
跟阿斌一起學(xué)鴻蒙(2): Ability vs App?
鴻蒙 Ability 講解(頁面生命周期、后臺服務(wù)、數(shù)據(jù)訪問)
圖解鴻蒙Feature Ability和AbilitySlice的關(guān)系
圖解鴻蒙Page Ability的LaunchType
#2020征文-手機#【鴻蒙基地】鴻蒙跨設(shè)備啟動窗口:Page Ability
#2020征文-手機#【鴻蒙基地】鴻蒙跨設(shè)備啟動窗口:Page Ability
HarmonyOS應(yīng)用開發(fā)-Page Ability啟動Service Ability
Page Cache是什么 一文帶你深入理解Linux的Page Cache

評論