在Page Ability的配置信息(config.json文件)中有一個(gè)launchType屬性,通過模板默認(rèn)生成的值是standard,這是launchType屬性的默認(rèn)值(可以不設(shè)置launchType,這樣默認(rèn)值就是standard)。launchType屬性的另外一個(gè)可以設(shè)置的值是singleton。這兩個(gè)屬性值的區(qū)別如下:
standard:在任何情況下,無論P(yáng)age Ability被顯示多少次,都會(huì)創(chuàng)建一個(gè)新的Page Ability實(shí)例;
singleton:如果要顯示的Page Ability在棧頂,那么再次顯示這個(gè)Page Ability時(shí),不會(huì)再創(chuàng)建新的Page Ability實(shí)例,而是直接使用這個(gè)Page Ability實(shí)例。如果Page Ability上面有其他的Page Ability,那么首先彈出這些Page Ability,然后再重用這個(gè)Page Ability。總之,擁有singleton模式的Page Ability將永遠(yuǎn)使用唯一的實(shí)例;
這里涉及到一個(gè)棧的概念,這是HarmonyOS管理Page Ability的模式。HarmonyOS App同時(shí)只能顯示一個(gè)Page Ability,那么哪一個(gè)Page Ability才能顯示呢?HarmonyOS App會(huì)使用一個(gè)棧來管理App中所有的Page Ability,只有在棧頂?shù)腜age Ability才會(huì)顯示。如果要想讓棧中第2個(gè)Page Ability顯示,那么棧頂?shù)腜age Ability就必須出棧,也就是銷毀Page Ability,也就是調(diào)用terminateAbility方法要完成的工作。
下面用圖示來說明這一過程。圖1中每一個(gè)矩形區(qū)域表示App中當(dāng)前用于保存Page Ability的棧。1中只有一個(gè)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中啟動(dòng)Page Ability1,如果啟動(dòng)2次,就會(huì)再創(chuàng)建兩個(gè)Page Ability1實(shí)例,這時(shí)棧的狀態(tài)如圖2所示。
很明顯,在棧中有3個(gè)Page Ability1實(shí)例。
如果Page Ability1的launchType屬性值是singleton,那么不管顯示多少次Page Ability1,在棧中永遠(yuǎn)只有1個(gè)Page Ability1實(shí)例。所以如果想讓某一個(gè)Page Ability1永遠(yuǎn)只有一個(gè)實(shí)例的時(shí)候,可以將該P(yáng)age Ability的launchType屬性值設(shè)為singleton。
下面通過一個(gè)案例來演示standard和singleton的區(qū)別。
首先創(chuàng)建一個(gè)名為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; // 計(jì)數(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”);
// 顯示另外一個(gè)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的啟動(dòng)類型”,
“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)建另外一個(gè)名為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ù)制本例包含兩個(gè)Page Ability:LaunchTypeAbility和TestLaunchTypeAbility。目前這兩個(gè)Page Ability的launchType屬性值都是standard。這兩個(gè)Page Ability的關(guān)系是LaunchTypeAbility顯示TestLaunchTypeAbility,然后TestLaunchTypeAbility再顯示LaunchTypeAbility,如圖3所示。
在LaunchTypeAbility類中有一個(gè)靜態(tài)變量count,如果每次顯示LaunchTypeAbility時(shí)都創(chuàng)建一個(gè)新的實(shí)例,那么count會(huì)不斷加1,例如,如果顯示3次LaunchTypeAbility,應(yīng)該看到如圖4所示的窗口。
如果將LaunchTypeAbility的launchType屬性值改成singleton,那么不管顯示多少次LaunchTypeAbility,計(jì)數(shù)器count的值永遠(yuǎn)是1,如圖5所示。因?yàn)長aunchTypeAbility在創(chuàng)建一個(gè)實(shí)例后,就不會(huì)再創(chuàng)建新的LaunchTypeAbility實(shí)例了,所以onStart方法自然就不會(huì)再次調(diào)用了。
編輯:hfy
-
鴻蒙系統(tǒng)
+關(guān)注
關(guān)注
183文章
2634瀏覽量
66157
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論