0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文解析鴻蒙Page Ability的LaunchType

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

在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)。

o4YBAGB5KPWAV-wkAAJQ3qzSM5Y038.png

現(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所示。

o4YBAGB5KQuAclREAAEGu967NuA679.png

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

pIYBAGB5KSeAYAx6AAJlit8ZUS4932.png

在LaunchTypeAbility類中有一個(gè)靜態(tài)變量count,如果每次顯示LaunchTypeAbility時(shí)都創(chuàng)建一個(gè)新的實(shí)例,那么count會(huì)不斷加1,例如,如果顯示3次LaunchTypeAbility,應(yīng)該看到如圖4所示的窗口。

o4YBAGB5KTqAIgN9AAE92ls7RU4576.png

如果將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)用了。

pIYBAGB5KUuAa7UHAAD99De-3o8231.png

編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 鴻蒙系統(tǒng)
    +關(guān)注

    關(guān)注

    183

    文章

    2634

    瀏覽量

    66157
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙開發(fā)接口Ability框架:【@ohos.application.Ability (Ability)】

    Ability模塊提供對(duì)Ability生命周期、上下文環(huán)境等調(diào)用管理的能力,包括Ability創(chuàng)建、銷毀、轉(zhuǎn)儲(chǔ)客戶端信息等。
    的頭像 發(fā)表于 04-30 17:42 ?2184次閱讀
    <b class='flag-5'>鴻蒙</b>開發(fā)接口<b class='flag-5'>Ability</b>框架:【@ohos.application.<b class='flag-5'>Ability</b> (<b class='flag-5'>Ability</b>)】

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

    FeatureAbility模塊提供帶有UI設(shè)計(jì)與用戶交互的能力,包括啟動(dòng)新的ability、獲取dataAbilityHelper、設(shè)置此Page Ability、獲取當(dāng)前Ability
    的頭像 發(fā)表于 05-06 16:31 ?905次閱讀
    <b class='flag-5'>鴻蒙</b>開發(fā)接口<b class='flag-5'>Ability</b>框架:【@ohos.<b class='flag-5'>ability</b>.featureAbility (FeatureAbility模塊)】

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

    創(chuàng)建AbilityPage頁面 創(chuàng)建兩個(gè)Ability:EntryAbility,DetailsAbility,其中EntryAbility是由工程默認(rèn)創(chuàng)建的,這里我們只講如何創(chuàng)建
    發(fā)表于 01-08 15:34

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

    鴻蒙HarmonyOS行業(yè)芯事經(jīng)驗(yàn)分享
    蒙娜麗寧
    發(fā)布于 :2022年02月25日 15:53:33

    HarmonyOS應(yīng)用開發(fā)-Ability

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

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

    在進(jìn)步實(shí)踐之前,需要先弄明白個(gè)概念:Ability。不知道你有沒有注意到,使用鴻蒙開發(fā)工具DevEco Studio創(chuàng)建項(xiàng)目時(shí),我們選擇創(chuàng)建的是
    發(fā)表于 11-30 20:56

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

    在進(jìn)步實(shí)踐之前,需要先弄明白個(gè)概念:Ability。不知道你有沒有注意到,使用鴻蒙開發(fā)工具DevEco Studio創(chuàng)建項(xiàng)目時(shí),我們選擇創(chuàng)建的是
    發(fā)表于 12-02 16:55

    鴻蒙 Ability 講解(頁面生命周期、后臺(tái)服務(wù)、數(shù)據(jù)訪問)

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

    圖解鴻蒙Feature Ability和AbilitySlice的關(guān)系

    當(dāng)我們?cè)贒evEco Studio中創(chuàng)建個(gè)鴻蒙項(xiàng)目時(shí),如果選擇的設(shè)備是手機(jī),并且選擇的模板是Empty Feature Ability(Java),如下圖所示,那么自動(dòng)生成的Hello World
    發(fā)表于 12-21 15:03

    圖解鴻蒙Page AbilityLaunchType

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

    #2020征文-手機(jī)#【鴻蒙基地】鴻蒙跨設(shè)備啟動(dòng)窗口:Page Ability

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

    #2020征文-手機(jī)#【鴻蒙基地】鴻蒙跨設(shè)備啟動(dòng)窗口:Page Ability

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

    HarmonyOS應(yīng)用開發(fā)-Page Ability啟動(dòng)Service Ability

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

    Page Cache是什么 帶你深入理解Linux的Page Cache

    是什么? 為了理解 Page Cache,我們不妨先看下 Linux 的文件 I/O 系統(tǒng),如下圖所示: Figure1. Linux 文件 I/O 系統(tǒng) 上圖中,紅色部分為 Page Cache??梢?
    的頭像 發(fā)表于 10-20 14:12 ?5873次閱讀
    <b class='flag-5'>Page</b> Cache是什么 <b class='flag-5'>一</b><b class='flag-5'>文</b>帶你深入理解Linux的<b class='flag-5'>Page</b> Cache

    鴻蒙開發(fā)第課-各類名詞介紹以及基礎(chǔ)功能實(shí)現(xiàn)

    FA支持Page AbilityPage模板是FA唯支持的模板,用于提供與用戶交互的能力。個(gè)Pa
    的頭像 發(fā)表于 01-25 14:32 ?463次閱讀
    <b class='flag-5'>鴻蒙</b>開發(fā)第<b class='flag-5'>一</b>課-各類名詞介紹以及基礎(chǔ)功能實(shí)現(xiàn)