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

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

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

深入理解HarmonyOS UIAbility:生命周期、WindowStage與啟動模式探析

王程 ? 來源:jf_75796907 ? 作者:jf_75796907 ? 2024-02-17 15:33 ? 次閱讀

UIAbility組件概述

UIAbility組件是HarmonyOS中一種包含UI界面的應(yīng)用組件,主要用于與用戶進(jìn)行交互。每個UIAbility組件實例對應(yīng)最近任務(wù)列表中的一個任務(wù),可以包含多個頁面來實現(xiàn)不同功能模塊。

聲明配置

為了使用UIAbility,首先需要在module.json5配置文件的abilities標(biāo)簽中聲明UIAbility的相關(guān)信息,包括名稱、入口、描述、圖標(biāo)等。

{
  "module": {
    // ...
    "abilities": [
      {
        "name": "EntryAbility", // UIAbility組件的名稱
        "srcEntrance": "./ets/entryability/EntryAbility.ts", // UIAbility組件的代碼路徑
        "description": "$string:EntryAbility_desc", // UIAbility組件的描述信息
        "icon": "$media:icon", // UIAbility組件的圖標(biāo)
        "label": "$string:EntryAbility_label", // UIAbility組件的標(biāo)簽
        "startWindowIcon": "$media:icon", // UIAbility組件啟動頁面圖標(biāo)資源文件的索引
        "startWindowBackground": "$color:start_window_background", // UIAbility組件啟動頁面背景顏色資源文件的索引
        // ...
      }
    ]
  }
}

UIAbility組件生命周期

UIAbility組件的生命周期包括四個狀態(tài):Create、Foreground、Background、Destroy。在不同狀態(tài)之間轉(zhuǎn)換時,系統(tǒng)會調(diào)用相應(yīng)的生命周期回調(diào)函數(shù)。

Create狀態(tài)

Create狀態(tài)表示UIAbility實例創(chuàng)建完成時觸發(fā),系統(tǒng)調(diào)用onCreate()回調(diào)。在該回調(diào)中可以進(jìn)行應(yīng)用初始化操作,如變量定義、資源加載等,為后續(xù)的UI界面展示做準(zhǔn)備。

import UIAbility from '@ohos.app.ability.UIAbility';

export default class EntryAbility extends UIAbility {
    onCreate(want, launchParam) {
        // 應(yīng)用初始化
    }
    // ...
}

WindowStageCreate和WindowStageDestroy狀態(tài)

在UIAbility實例創(chuàng)建完成后,在進(jìn)入Foreground之前,系統(tǒng)會創(chuàng)建一個WindowStage。WindowStage創(chuàng)建完成后會觸發(fā)onWindowStageCreate()回調(diào),可以在該回調(diào)中設(shè)置UI界面加載和訂閱WindowStage的事件。

import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';

export default class EntryAbility extends UIAbility {
    onWindowStageCreate(windowStage: Window.WindowStage) {
        // 設(shè)置WindowStage的事件訂閱(獲焦/失焦、可見/不可見)

        // 設(shè)置UI界面加載
        windowStage.loadContent('pages/Index', (err, data) => {
            // ...
        });
    }
    // ...
}

// 對應(yīng)onWindowStageCreate回調(diào),在UIAbility實例銷毀之前,會先進(jìn)入onWindowStageDestroy回調(diào),可以在該回調(diào)中釋放UI界面資源。
export default class EntryAbility extends UIAbility {
    // ...

    onWindowStageDestroy() {
        // 釋放UI界面資源
    }
}

Foreground和Background狀態(tài)

Foreground和Background狀態(tài)分別在UIAbility實例切換至前臺和切換至后臺時觸發(fā),對應(yīng)于onForeground()和onBackground()回調(diào)。在onForeground()中可以申請系統(tǒng)需要的資源,而在onBackground()中可以釋放UI界面不可見時無用的資源。

import UIAbility from '@ohos.app.ability.UIAbility';

export default class EntryAbility extends UIAbility {
    onForeground() {
        // 申請系統(tǒng)需要的資源,或者重新申請在onBackground中釋放的資源
    }

    onBackground() {
        // 釋放UI界面不可見時無用的資源,或者在此回調(diào)中執(zhí)行較為耗時的操作,例如狀態(tài)保存等
    }
}

Destroy狀態(tài)

Destroy狀態(tài)在UIAbility實例銷毀時觸發(fā),可以在onDestroy()回調(diào)中進(jìn)行系統(tǒng)資源的釋放、數(shù)據(jù)的保存等操作。

import UIAbility from '@ohos.app.ability.UIAbility';

export default class EntryAbility extends UIAbility {
    onDestroy() {
        // 系統(tǒng)資源的釋放、數(shù)據(jù)的保存等
    }
}

UIAbility組件啟動模式

UIAbility的啟動模式有三種:singleton(單實例模式)、standard(標(biāo)準(zhǔn)實例模式)、specified(指定實例模式)。

Singleton啟動模式

Singleton啟動模式為單實例模式,是默認(rèn)的啟動模式。每次調(diào)用startAbility()方法時,如果應(yīng)用進(jìn)程中該類型的UIAbility實例已經(jīng)存在,則復(fù)用該實例。系統(tǒng)中只存在唯一一個該UIAbility實例。

{
  "module": {
    // ...
    "abilities": [
      {
        "launchType": "singleton",
        // ...
      }
    ]
  }
}

Standard啟動模式

Standard啟動模式為標(biāo)準(zhǔn)實例模式,每次調(diào)用startAbility()方法時,都會在應(yīng)用進(jìn)程中創(chuàng)建一個新的該類型UIAbility實例。在最近任務(wù)列表中可以看到多個該類型的UIAbility實例。

{
  "module": {
    // ...
    "abilities": [
      {
        "launchType": "standard",
        // ...
      }
    ]
  }
}

Specified啟動模式

Specified啟動模式為指定實例模式,允許為UIAbility實例創(chuàng)建一個唯一的Key,后續(xù)每次調(diào)用startAbility()方法時,都會詢問應(yīng)用使用哪個Key對應(yīng)的UIAbility實例來響應(yīng)請求。

{
  "module": {
    // ...
    "abilities": [
      {
        "launchType": "specified",
        // ...
      }
    ]
  }
}

在指定實例模式下,需要在啟動UIAbility時傳入自定義參數(shù),如"instanceKey",用于區(qū)分UIAbility實例。

let want = {
    deviceId: '', // deviceId為空表示本設(shè)備
    bundleName: 'com.example.myapplication',
    abilityName: 'FuncAbility',
    moduleName: 'module1', // moduleName非必選
    parameters: { // 自定義信息
        instanceKey: getInstance(),
    },
};

// context

為調(diào)用方UIAbility的AbilityContext
this.context.startAbility(want).then(() => {
    // ...
}).catch((err) => {
    // ...
});

在被調(diào)用方UIAbility的AbilityStage中,通過onAcceptWant()生命周期回調(diào)返回一個字符串Key標(biāo)識,用于匹配已創(chuàng)建的UIAbility實例。

import AbilityStage from '@ohos.app.ability.AbilityStage';

export default class MyAbilityStage extends AbilityStage {
    onAcceptWant(want): string {
        // 在被調(diào)用方的AbilityStage中,針對啟動模式為specified的UIAbility返回一個UIAbility實例對應(yīng)的一個Key值
        // 當(dāng)前示例指的是module1 Module的FuncAbility
        if (want.abilityName === 'FuncAbility') {
            // 返回的字符串Key標(biāo)識為自定義拼接的字符串內(nèi)容
            return `ControlModule_EntryAbilityInstance_${want.parameters.instanceKey}`;
        }

        return '';
    }
}

例如,在文檔應(yīng)用中,可以將文件路徑作為一個Key標(biāo)識,實現(xiàn)每次新建文檔都創(chuàng)建一個新的UIAbility實例,而打開已保存的文檔時重用相應(yīng)的UIAbility實例。

以上就是HarmonyOS UIAbility組件的概述、聲明配置、生命周期、以及啟動模式的詳細(xì)介紹。通過了解這些知識點,開發(fā)者可以更好地利用UIAbility組件構(gòu)建豐富的HarmonyOS應(yīng)用。

HarmonyOS UIAbility組件進(jìn)階

WindowStage和UI界面

在HarmonyOS中,UIAbility組件的界面展示主要通過WindowStage和UI界面來實現(xiàn)。WindowStage代表著UIAbility的窗口舞臺,而UI界面則通過加載相應(yīng)的頁面來完成展示。

WindowStage的創(chuàng)建和銷毀

在UIAbility實例創(chuàng)建完成后,在進(jìn)入Foreground狀態(tài)之前,系統(tǒng)會創(chuàng)建一個WindowStage。在onWindowStageCreate()回調(diào)中,可以設(shè)置UIAbility要加載的頁面,并訂閱WindowStage的事件。

wKgaomXQYS6AHPH4AAFSRGoaJss975.pngwKgZomXQYKyAPKMnAAFSRGoaJss247.png

import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';

export default class EntryAbility extends UIAbility {
    onWindowStageCreate(windowStage: Window.WindowStage) {
        // 設(shè)置WindowStage的事件訂閱(獲焦/失焦、可見/不可見)

        // 設(shè)置UI界面加載
        windowStage.loadContent('pages/Index', (err, data) => {
            // ...
        });
    }

    // ...
}

對應(yīng)的,在UIAbility實例銷毀之前,會先進(jìn)入onWindowStageDestroy()回調(diào),可以在該回調(diào)中釋放UI界面資源。

import UIAbility from '@ohos.app.ability.UIAbility';

export default class EntryAbility extends UIAbility {
    // ...

    onWindowStageDestroy() {
        // 釋放UI界面資源
    }
}

UI界面的加載

在onWindowStageCreate()回調(diào)中,通過loadContent()方法設(shè)置UIAbility要加載的頁面。這里的頁面路徑可以是相對路徑,也可以是絕對路徑。

import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';

export default class EntryAbility extends UIAbility {
    onWindowStageCreate(windowStage: Window.WindowStage) {
        // 設(shè)置WindowStage的事件訂閱(獲焦/失焦、可見/不可見)

        // 設(shè)置UI界面加載
        windowStage.loadContent('pages/Index', (err, data) => {
            // ...
        });
    }

    // ...
}

生命周期示例

下面以一個簡單的示例說明UIAbility的生命周期狀態(tài)變化:

import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';

export default class EntryAbility extends UIAbility {
    onCreate(want, launchParam) {
        // Create狀態(tài)
        console.info('onCreate');
    }

    onWindowStageCreate(windowStage: Window.WindowStage) {
        // WindowStageCreate狀態(tài)
        console.info('onWindowStageCreate');

        // 設(shè)置UI界面加載
        windowStage.loadContent('pages/Index', (err, data) => {
            // ...
        });
    }

    onForeground() {
        // Foreground狀態(tài)
        console.info('onForeground');
    }

    onBackground() {
        // Background狀態(tài)
        console.info('onBackground');
    }

    onDestroy() {
        // Destroy狀態(tài)
        console.info('onDestroy');
    }
}

在應(yīng)用加載過程中,onCreate()回調(diào)表示Create狀態(tài),之后進(jìn)入Foreground狀態(tài)前會觸發(fā)onWindowStageCreate()回調(diào),然后在切換至后臺和銷毀時分別觸發(fā)onBackground()和onDestroy()回調(diào)。

UIAbility組件啟動模式進(jìn)階

在前面提到的UIAbility的啟動模式中,除了基本的singleton、standard、specified啟動模式外,還可以根據(jù)實際場景進(jìn)行靈活的配置和使用。

使用singleton啟動模式

singleton啟動模式為單實例模式,默認(rèn)情況下的啟動模式。每次調(diào)用startAbility()方法時,如果應(yīng)用進(jìn)程中已存在該類型的UIAbility實例,則系統(tǒng)會復(fù)用該實例。系統(tǒng)中只存在唯一一個該UIAbility實例。

`配置文件中的"abilities"標(biāo)簽下的"launchType"字段配置為"singleton"即可。

{
    "module": {
        // ...
        "abilities": [
            {
                "launchType": "singleton",
                // ...
            }
        ]
    }
}

使用standard啟動模式

standard啟動模式為標(biāo)準(zhǔn)實例模式,每次調(diào)用startAbility()方法時,都會在應(yīng)用進(jìn)程中創(chuàng)建一個新的該類型UIAbility實例。在最近任務(wù)列表中可以看到有多個該類型的UIAbility實例。

wKgaomXQYHaATjz3AADm7sd3zrU426.pngwKgZomXQYS6ANt9yAADm7sd3zrU002.png

在module.json5配置文件中的"abilities"標(biāo)簽下的"launchType"字段配置為"standard"即可。

{
    "module": {
        // ...
        "abilities": [
            {
                "launchType": "standard",
                // ...
            }
        ]
    }
}

使用specified啟動模式

specified啟動模式為指定實例模式,允許在UIAbility實例創(chuàng)建之前為其創(chuàng)建一個唯一的字符串Key。每次調(diào)用startAbility()方法時,會詢問應(yīng)用使用哪個Key對應(yīng)的UIAbility實例來響應(yīng)請求。如果匹配有該UIAbility實例的Key,則直接拉起與之綁定的UIAbility實例,否則創(chuàng)建一個新的UIAbility實例。

在module.json5配置文件中的"abilities"標(biāo)簽下的"launchType"字段配置為"specified"即可。

{
    "module": {
        // ...
        "abilities": [
            {
                "launchType": "specified",
                // ...
            }
        ]
    }
}

指定實例模式的使用場景

specified啟動模式適用于一些特殊場景,例如文檔應(yīng)用中每次新建文檔希望都能新建一個文檔實例,而重復(fù)打開一個已保存的文檔時希望打開的都是同一個文檔實例。

在使用指定實例模式時,需要在UIAbility實例創(chuàng)建之前為其創(chuàng)建一個唯一的字符串Key。在啟動UIAbility時,通過自定義參數(shù)傳遞這個Key,用于匹配已創(chuàng)建的UIAbility實例。

例如,有兩個UIAbility:EntryAbility和FuncAbility,其中FuncAbility配置為specified啟動模式。在EntryAbility中調(diào)用startAbility()方法啟動FuncAbility時,需要在want參數(shù)中增加一個自定義參數(shù)來區(qū)別UIAbility實例,例如增加一個"instanceKey"自定義參數(shù)。

// 在啟動指定實例模式的UIAbility時,給每一個UIAbility實例配置一個獨立的Key標(biāo)識
// 例如在文檔使用場景中,可以用文檔路徑作為Key標(biāo)識
function getInstance() {
    // ...
}

let want = {
    deviceId: '', // deviceId為空表示本設(shè)備
    bundleName: 'com.example.myapplication',
    abilityName: 'FuncAbility',
    moduleName: 'module1', // moduleName非必選
    parameters: { // 自定義信息
        instanceKey: getInstance(),
    },
}

// context為調(diào)用方UIAbility的AbilityContext
this.context.startAbility(want).then(() => {
    // ...
}).catch((err) => {
    // ...
});

在被調(diào)用方UIAbility的AbilityStage中,通過onAcceptWant()生命周期回調(diào)返回一個字符串Key標(biāo)識,用于匹配已創(chuàng)建的UIAbility實例。

import AbilityStage from '@ohos.app.ability.AbilityStage';

export default class MyAbilityStage extends AbilityStage {
    onAcceptWant(want): string {
        // 在被調(diào)用方的AbilityStage中,針對啟動模式為specified的UIAbility返回一個UIAbility實例對應(yīng)的一個Key值
        // 當(dāng)前示例指的是module1 Module的FuncAbility
        if (want.abilityName === 'FuncAbility') {
            // 返回的字符串Key標(biāo)識為自定義拼接的字符串內(nèi)容
            return `ControlModule_EntryAbilityInstance_${want.parameters.instanceKey}`;
        }

        return '';
    }
}

例如,在文檔應(yīng)用中,可以對不同的文檔實例內(nèi)容綁定不同的Key值。每次新建文檔時,可以傳入不同的新Key值(如將文件的路徑作為一個Key標(biāo)識),此時AbilityStage中啟動UIAbility時都會創(chuàng)建一個新的UIAbility實例。而當(dāng)新建的文檔保存之后,回到桌面,或者新打開一個已保存的文檔,再次打開該已保存的文檔時,AbilityStage中再次啟動該UIAbility時,打開的仍然是之前原來已保存的文檔界面。

// 在文檔應(yīng)用中,可以對不同的文檔實例內(nèi)容綁定不同的Key值
// 當(dāng)每次新建文檔時,傳入不同的新Key值(如可以將文件的路徑作為一個Key標(biāo)識)
// 此時AbilityStage中啟動UIAbility時都會創(chuàng)建一個新的UIAbility實例
// 而當(dāng)新建的文檔保存之后,回到桌面,或者新打開一個已保存的文檔,再次打開該已保存的文檔時,
// AbilityStage中再次啟動該UIAbility時,打開的仍然是之前原來已保存的文檔界面

這樣,通過指定實例模式的配置,可以實現(xiàn)更加靈活和符合業(yè)務(wù)場景的UIAbility啟動方式。

審核編輯 黃宇

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

    關(guān)注

    0

    文章

    202

    瀏覽量

    21316
  • singleton
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    5262
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1956

    瀏覽量

    29907
收藏 人收藏

    評論

    相關(guān)推薦

    鴻蒙Ability Kit(程序框架服務(wù))【UIAbility組件生命周期

    當(dāng)用戶打開、切換和返回到對應(yīng)應(yīng)用時,應(yīng)用中的UIAbility實例會在其生命周期的不同狀態(tài)之間轉(zhuǎn)換。UIAbility類提供了一系列回調(diào),通過這些回調(diào)可以知道當(dāng)前UIAbility實例
    的頭像 發(fā)表于 05-30 21:51 ?1328次閱讀
    鴻蒙Ability Kit(程序框架服務(wù))【<b class='flag-5'>UIAbility</b>組件<b class='flag-5'>生命周期</b>】

    鴻蒙原生應(yīng)用/元服務(wù)開發(fā)-Stage模型能力接口(九)上

    @ohos.app.ability.UIAbility (UIAbility) 一、說明 UIAbility是包含UI界面的應(yīng)用組件,提供組件創(chuàng)建、銷毀、前后臺切換等生命周期回調(diào),同時
    發(fā)表于 12-21 15:41

    鴻蒙開發(fā)-應(yīng)用程序框架UIAbility的使用

    ,WindowStageCreate和WindowStageDestroy為窗口管理器(WindowStage)在UIAbility中管理UI界面功能的兩個生命周期回調(diào),從而實現(xiàn)UIAbili
    發(fā)表于 01-17 16:36

    理解數(shù)據(jù)生命周期管理思路

    數(shù)據(jù)生命周期管理的思考
    發(fā)表于 03-17 10:49

    HarmonyOS應(yīng)用開發(fā)-PageAbility生命周期

    pageAbility的生命周期如下圖所示:在代碼中通過調(diào)用下列方法實現(xiàn)生命周期操作:onShow() :Ability由后臺不可見狀態(tài)切換到前臺可見狀態(tài)調(diào)用onShow方法,此時用戶在屏幕可以看到
    發(fā)表于 10-17 11:11

    在S32G2 RM中有“生命周期”,生命周期的完整含義是什么?

    在S32G2 RM中,有“生命周期”。生命周期的完整含義是什么,我們應(yīng)該如何使用它?
    發(fā)表于 04-23 10:37

    ArkTS語言HarmonyOS/OpenHarmony應(yīng)用開發(fā)-router事件跳轉(zhuǎn)到指定UIAbility

    = params.targetPage; } } // 如果UIAbility已在后臺運行,在收到Router事件后會觸發(fā)onNewWant生命周期回調(diào) onNewWant(want, launchParam
    發(fā)表于 06-13 17:22

    HarmonyOS/OpenHarmony應(yīng)用開發(fā)-Stage模型UIAbility組件使用(一)

    文件的索引 // ... } ] } } 復(fù)制 二、UIAbility組件生命周期1.概述 當(dāng)用戶打開、切換和返回到對應(yīng)應(yīng)用時,應(yīng)用中的UIAbility實例會在其生命周期的不同
    發(fā)表于 06-28 10:32

    HarmonyOS/OpenHarmony應(yīng)用開發(fā)-Stage模型UIAbility組件使用(一)

    文件的索引 // ... } ] } } 復(fù)制 二、UIAbility組件生命周期1.概述 當(dāng)用戶打開、切換和返回到對應(yīng)應(yīng)用時,應(yīng)用中的UIAbility實例會在其生命周期的不同
    發(fā)表于 06-28 10:32

    鴻蒙原生應(yīng)用/元服務(wù)開發(fā)-Stage模型能力接口(三)

    : UIAbility, windowStage: window.WindowStage): void; 注冊監(jiān)聽?wèi)?yīng)用上下文的生命周期后,在wind
    發(fā)表于 12-13 10:26

    華為開發(fā)者HarmonyOS零基礎(chǔ)入門:生命周期函數(shù)應(yīng)用

    華為開發(fā)者HarmonyOS零基礎(chǔ)入門:生命周期函數(shù),結(jié)合周期函數(shù)找到相關(guān)主鍵顯示,最新加載渲染函數(shù)。
    的頭像 發(fā)表于 10-23 10:52 ?1359次閱讀
    華為開發(fā)者<b class='flag-5'>HarmonyOS</b>零基礎(chǔ)入門:<b class='flag-5'>生命周期</b>函數(shù)應(yīng)用

    Synopsys 啟動生命周期管理計劃

    Synopsis 的數(shù)據(jù)分析驅(qū)動的硅生命周期管理計劃解決了 IC 生命周期中的質(zhì)量、可靠性和安全挑戰(zhàn)。
    發(fā)表于 08-18 15:37 ?794次閱讀
    Synopsys <b class='flag-5'>啟動</b>硅<b class='flag-5'>生命周期</b>管理計劃

    Vue入門Vue的生命周期

    .生命周期 4.1生命周期是什么 Vue的生命周期, 就是Vue實例從創(chuàng)建到銷毀的過程.
    的頭像 發(fā)表于 02-06 16:16 ?817次閱讀
    Vue入門Vue的<b class='flag-5'>生命周期</b>

    HarmonyOS開發(fā)案例:【UIAbility和自定義組件生命周期

    本文檔主要描述了應(yīng)用運行過程中UIAbility和自定義組件的生命周期。對于UIAbility,描述了Create、Foreground、Background、Destroy四種生命周期
    的頭像 發(fā)表于 05-10 15:31 ?1044次閱讀
    <b class='flag-5'>HarmonyOS</b>開發(fā)案例:【<b class='flag-5'>UIAbility</b>和自定義組件<b class='flag-5'>生命周期</b>】

    鴻蒙Ability Kit(程序框架服務(wù))【UIAbility組件生命周期】實例

    本文檔主要描述了應(yīng)用運行過程中UIAbility和自定義組件的生命周期。對于UIAbility,描述了Create、Foreground、Background、Destroy四種生命周期
    的頭像 發(fā)表于 05-31 15:03 ?932次閱讀
    鴻蒙Ability Kit(程序框架服務(wù))【<b class='flag-5'>UIAbility</b>組件<b class='flag-5'>生命周期</b>】實例