2020征文-TV【鴻蒙基地】圖解鴻蒙Page Ability的LaunchType
想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.51cto.com/#zz
在Page Ability的配置信息(config.json文件)中有一個(gè)launchType屬性,通過(guò)模板默認(rèn)生成的值是standard,這是launchType屬性的默認(rèn)值(可以不設(shè)置launchType,這樣默認(rèn)值就是standard)。launchType屬性的另外一個(gè)可以設(shè)置的值是singleton。這兩個(gè)屬性值的區(qū)別如下:
standard:在任何情況下,無(wú)論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è)棧來(lái)管理App中所有的Page Ability,只有在棧頂?shù)腜age Ability才會(huì)顯示。如果要想讓棧中第2個(gè)Page Ability顯示,那么棧頂?shù)腜age Ability就必須出棧,也就是銷毀Page Ability,也就是調(diào)用terminateAbility方法要完成的工作。
下面用圖示來(lái)說(shuō)明這一過(guò)程。圖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。
下面通過(guò)一個(gè)案例來(lái)演示standard和singleton的區(qū)別。
首先創(chuàng)建一個(gè)名為L(zhǎng)aunchTypeAbility的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);
- }
- });
- }
- }
- }
在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的啟動(dòng)類型",
- "type": "page",
- "launchType": "standard"
- }
這里將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);
- }
- });
- }
- }
- }
本例包含兩個(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)長(zhǎng)aunchTypeAbility在創(chuàng)建一個(gè)實(shí)例后,就不會(huì)再創(chuàng)建新的LaunchTypeAbility實(shí)例了,所以onStart方法自然就不會(huì)再次調(diào)用了。

歡迎訪問(wèn)李寧老師的【鴻蒙基地】專欄:https://harmonyos.51cto.com/column/17
李寧老師的課程主頁(yè):https://edu.51cto.com/lecturer/974126.html
想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.51cto.com/#zz
【編輯推薦】