<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一文解析鴻蒙Page Ability的LaunchType

鴻蒙系統HarmonyOS ? 來源:51CTO ? 作者:蒙娜麗寧 ? 2021-04-16 14:07 ? 次閱讀

在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中棧的狀態。

o4YBAGB5KPWAV-wkAAJQ3qzSM5Y038.png

現在假設Page Ability1的launchType屬性值是standard,那么從Page Ability1中啟動Page Ability1,如果啟動2次,就會再創建兩個Page Ability1實例,這時棧的狀態如圖2所示。

o4YBAGB5KQuAclREAAEGu967NuA679.png

很明顯,在棧中有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所示。

pIYBAGB5KSeAYAx6AAJlit8ZUS4932.png

在LaunchTypeAbility類中有一個靜態變量count,如果每次顯示LaunchTypeAbility時都創建一個新的實例,那么count會不斷加1,例如,如果顯示3次LaunchTypeAbility,應該看到如圖4所示的窗口。

o4YBAGB5KTqAIgN9AAE92ls7RU4576.png

如果將LaunchTypeAbility的launchType屬性值改成singleton,那么不管顯示多少次LaunchTypeAbility,計數器count的值永遠是1,如圖5所示。因為LaunchTypeAbility在創建一個實例后,就不會再創建新的LaunchTypeAbility實例了,所以onStart方法自然就不會再次調用了。

pIYBAGB5KUuAa7UHAAD99De-3o8231.png

編輯:hfy

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 鴻蒙系統
    +關注

    關注

    183

    文章

    2615

    瀏覽量

    65350
收藏 人收藏

    評論

    相關推薦

    鴻蒙Ability開發-Stage模型下Ability的創建和使用

    創建AbilityPage頁面 創建兩個Ability:EntryAbility,DetailsAbility,其中EntryAbility是由工程默認創建的,這里我們只講如何創建
    發表于 01-08 15:34

    【全球首套鴻蒙2.0教程】鴻蒙(HarmonyOS)2.0入門與實戰【李寧】 - 2.Ability Page

    鴻蒙HarmonyOS行業芯事經驗分享
    蒙娜麗寧
    發布于 :2022年02月25日 15:53:33

    【全球首套鴻蒙2.0教程】鴻蒙(HarmonyOS)2.0入門與實戰【李寧】 - 3.Page Ability

    鴻蒙HarmonyOS行業芯事經驗分享
    蒙娜麗寧
    發布于 :2022年02月25日 15:54:41

    HarmonyOS應用開發-Ability

    是FA唯支持的模板,用于提供與用戶交互的能力。Page實例可以包含組相關頁面,每個頁面用個AbilitySlice實例表示。PA支
    發表于 09-24 15:39

    跟阿斌起學鴻蒙(2): Ability vs App?

    在進步實踐之前,需要先弄明白個概念:Ability。不知道你有沒有注意到,使用鴻蒙開發工具DevEco Studio創建項目時,我們選擇創建的是
    發表于 11-30 20:56

    跟阿斌起學鴻蒙(2): Ability vs App?

    在進步實踐之前,需要先弄明白個概念:Ability。不知道你有沒有注意到,使用鴻蒙開發工具DevEco Studio創建項目時,我們選擇創建的是
    發表于 12-02 16:55

    鴻蒙 Ability 講解(頁面生命周期、后臺服務、數據訪問)

    Ability) (音譯:非ture 阿B了D),中文意思是功能能力,它支持Page Ability 頁面能力用于提供與用戶交互的能力。Pag
    發表于 12-17 10:37

    圖解鴻蒙Feature Ability和AbilitySlice的關系

    當我們在DevEco Studio中創建鴻蒙項目時,如果選擇的設備是手機,并且選擇的模板是Empty Feature Ability(Java),如下圖所示,那么自動生成的Hello World
    發表于 12-21 15:03

    圖解鴻蒙Page AbilityLaunchType

    Page Ability的配置信息(config.json文件)中有launchType屬性,通過模板默認生成的值是standard,這是la
    發表于 12-24 09:09

    #2020征文-手機#【鴻蒙基地】鴻蒙跨設備啟動窗口:Page Ability

    HarmonyOS的核心特性(或稱為賣點)之就是軟總線技術,而Page Ability的跨設備遷移是軟總線的個具體技術實現。所謂跨設備遷移Pag
    發表于 12-31 11:56

    #2020征文-手機#【鴻蒙基地】鴻蒙跨設備啟動窗口:Page Ability

    HarmonyOS的核心特性(或稱為賣點)之就是軟總線技術,而Page Ability的跨設備遷移是軟總線的個具體技術實現。所謂跨設備遷移Pag
    發表于 01-25 14:13

    個小白曾經踩過的坑,鴻蒙

    AbilitySlice的名稱當做AbilityName,在函數withAbilityName中只能填寫Ability的名稱,至于要具體啟動那個AbilitySlice可以有兩種方法來控制,種是通過傳參在
    發表于 09-04 21:42

    HarmonyOS應用開發-Page Ability啟動Service Ability

    Page Ablity響應交互,從而調用Service Ability鴻蒙開發中最常用的交互方式,在Page Ablity使用startAbility(intent)啟動Servic
    發表于 11-03 10:32

    鴻蒙開發如何修改默認執行自定義Ability,然后根據需要進入MainAbility呢?

    各位大佬,目前遇到個問題,就是在進行鴻蒙開發的時候,系統會默認先執行MainAbility,那么要如何修改默認執行自定義Ability,然后根據需要進入MainAbility呢???
    發表于 03-17 15:46

    鴻蒙開發第一課-各類名詞介紹以及基礎功能實現

    前提 本文基于鴻蒙sdk version6進行編寫。 名詞介紹 開發鴻蒙應用最重要使用ability能力,Ability其實和Spring MVC相像。
    的頭像 發表于 01-25 14:32 ?172次閱讀
    <b class='flag-5'>鴻蒙</b>開發第一課-各類名詞介紹以及基礎功能實現
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>