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

来源:https://www.cnblogs.com/huaweiyun/archive/2023/12/04/17874344.html
-Advertisement-
Play Games

本文分享自華為雲社區《深入理解HarmonyOS UIAbility:生命周期、WindowStage與啟動模式探析》,作者:檸檬味擁抱。 UIAbility組件概述 UIAbility組件是HarmonyOS中一種包含UI界面的應用組件,主要用於與用戶進行交互。每個UIAbility組件實例對應最 ...


本文分享自華為雲社區《深入理解HarmonyOS UIAbility:生命周期、WindowStage與啟動模式探析》,作者:檸檬味擁抱。

UIAbility組件概述

UIAbility組件是HarmonyOS中一種包含UI界面的應用組件,主要用於與用戶進行交互。每個UIAbility組件實例對應最近任務列表中的一個任務,可以包含多個頁面來實現不同功能模塊。

聲明配置

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

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

UIAbility組件生命周期

UIAbility組件的生命周期包括四個狀態:Create、Foreground、Background、Destroy。在不同狀態之間轉換時,系統會調用相應的生命周期回調函數。

Create狀態

Create狀態表示UIAbility實例創建完成時觸發,系統調用onCreate()回調。在該回調中可以進行應用初始化操作,如變數定義、資源載入等,為後續的UI界面展示做準備。

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

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

WindowStageCreate和WindowStageDestroy狀態

在UIAbility實例創建完成後,在進入Foreground之前,系統會創建一個WindowStage。WindowStage創建完成後會觸發onWindowStageCreate()回調,可以在該回調中設置UI界面載入和訂閱WindowStage的事件。

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

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

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

// 對應onWindowStageCreate回調,在UIAbility實例銷毀之前,會先進入onWindowStageDestroy回調,可以在該回調中釋放UI界面資源。
export default class EntryAbility extends UIAbility {
    // ...

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

Foreground和Background狀態

Foreground和Background狀態分別在UIAbility實例切換至前臺和切換至後臺時觸發,對應於onForeground()onBackground()回調。在onForeground()中可以申請系統需要的資源,而在onBackground()中可以釋放UI界面不可見時無用的資源。

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

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

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

Destroy狀態

Destroy狀態在UIAbility實例銷毀時觸發,可以在onDestroy()回調中進行系統資源的釋放、數據的保存等操作。

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

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

UIAbility組件啟動模式

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

Singleton啟動模式

Singleton啟動模式為單實例模式,是預設的啟動模式。每次調用startAbility()方法時,如果應用進程中該類型的UIAbility實例已經存在,則復用該實例。系統中只存在唯一一個該UIAbility實例。

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

Standard啟動模式

Standard啟動模式為標準實例模式,每次調用startAbility()方法時,都會在應用進程中創建一個新的該類型UIAbility實例。在最近任務列表中可以看到多個該類型的UIAbility實例。

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

Specified啟動模式

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

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

在指定實例模式下,需要在啟動UIAbility時傳入自定義參數,如"instanceKey",用於區分UIAbility實例。

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

// context

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

在被調用方UIAbility的AbilityStage中,通過onAcceptWant()生命周期回調返回一個字元串Key標識,用於匹配已創建的UIAbility實例。

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

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

        return '';
    }
}

例如,在文檔應用中,可以將文件路徑作為一個Key標識,實現每次新建文檔都創建一個新的UIAbility實例,而打開已保存的文檔時重用相應的UIAbility實例。

以上就是HarmonyOS UIAbility組件的概述、聲明配置、生命周期、以及啟動模式的詳細介紹。通過瞭解這些知識點,開發者可以更好地利用UIAbility組件構建豐富的HarmonyOS應用。

HarmonyOS UIAbility組件進階

WindowStage和UI界面

在HarmonyOS中,UIAbility組件的界面展示主要通過WindowStage和UI界面來實現。WindowStage代表著UIAbility的視窗舞臺,而UI界面則通過載入相應的頁面來完成展示。

WindowStage的創建和銷毀

在UIAbility實例創建完成後,在進入Foreground狀態之前,系統會創建一個WindowStage。在onWindowStageCreate()回調中,可以設置UIAbility要載入的頁面,並訂閱WindowStage的事件。

 

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

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

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

    // ...
}

對應的,在UIAbility實例銷毀之前,會先進入onWindowStageDestroy()回調,可以在該回調中釋放UI界面資源。

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

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

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

UI界面的載入

onWindowStageCreate()回調中,通過loadContent()方法設置UIAbility要載入的頁面。這裡的頁面路徑可以是相對路徑,也可以是絕對路徑。

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

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

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

    // ...
}

生命周期狀態說明

UIAbility的生命周期包括Create、Foreground、Background、Destroy四個狀態,如下圖所示。

 

生命周期示例

下麵以一個簡單的示例說明UIAbility的生命周期狀態變化:

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

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

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

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

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

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

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

在應用載入過程中,onCreate()回調表示Create狀態,之後進入Foreground狀態前會觸發onWindowStageCreate()回調,然後在切換至後臺和銷毀時分別觸發onBackground()onDestroy()回調。

UIAbility組件啟動模式進階

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

使用singleton啟動模式

singleton啟動模式為單實例模式,預設情況下的啟動模式。每次調用startAbility()方法時,如果應用進程中已存在該類型的UIAbility實例,則系統會復用該實例。系統中只存在唯一一個該UIAbility實例。

 

在`module.json5

`配置文件中的"abilities"標簽下的"launchType"欄位配置為"singleton"即可。

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

使用standard啟動模式

standard啟動模式為標準實例模式,每次調用startAbility()方法時,都會在應用進程中創建一個新的該類型UIAbility實例。在最近任務列表中可以看到有多個該類型的UIAbility實例。

 

module.json5配置文件中的"abilities"標簽下的"launchType"欄位配置為"standard"即可。

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

使用specified啟動模式

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

 

module.json5配置文件中的"abilities"標簽下的"launchType"欄位配置為"specified"即可。

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

指定實例模式的使用場景

specified啟動模式適用於一些特殊場景,例如文檔應用中每次新建文檔希望都能新建一個文檔實例,而重覆打開一個已保存的文檔時希望打開的都是同一個文檔實例。

在使用指定實例模式時,需要在UIAbility實例創建之前為其創建一個唯一的字元串Key。在啟動UIAbility時,通過自定義參數傳遞這個Key,用於匹配已創建的UIAbility實例。

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

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

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

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

在被調用方UIAbility的AbilityStage中,通過onAcceptWant()生命周期回調返回一個字元串Key標識,用於匹配已創建的UIAbility實例。

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

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

        return '';
    }
}

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

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

這樣,通過指定實例模式的配置,可以實現更加靈活和符合業務場景的UIAbility啟動方式。

結語

通過本文,我們詳細介紹了HarmonyOS UIAbility組件的生命周期、WindowStage的創建和銷毀、UI界面的載入,以及UIAbility的啟動模式。通過瞭解這些知識點,開發者可以更好地利用UIAbility組件構建豐富的HarmonyOS應用。同時,對於啟動模式的理解和靈活運用,可以根據不同業務場景選擇合適的模式,提升應用的用戶體驗。希望本文對於HarmonyOS開發者能夠提供有益的參考和幫助。

點擊關註,第一時間瞭解華為雲新鮮技術~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 模塊--》文件 包--》文件夾 我們將類似功能的模塊放到一起(包)內,要用時直接導入即可 語法: import 模塊名 as 別名: 》取別名是為了可以節省時間,簡化代碼 import win32process as pro # 以後直接用pro即可 模塊分為三種: 1.內置模塊 2.第三方模塊 3 ...
  • 日誌引擎系列 這些引擎是為了需要寫入許多小數據量(少於一百萬行)的表的場景而開發的。 這系列的引擎有: StripeLog Log TinyLog 共同屬性 引擎: 數據存儲在磁碟上。 寫入時將數據追加在文件末尾。 不支持突變操作,也就是更新。 不支持索引。 這意味著 `SELECT` 在範圍查詢時 ...
  • EXPLAIN 語句來能夠查看某個查詢語句的具體執行計劃,要搞懂 EPLATN 的各個輸出項都有什麼作用,從而可以有針對性的提升查詢語句的性能。通過使用 EXPLAIN 關鍵字可以模擬優化器執行 SQL 查詢語句,從而知道 MySQL 是如何處理 SQL 語句的。分析查詢語句或是表結構的性能瓶頸。 ...
  • 面對今日頭條、抖音等不同產品線的複雜數據質量場景,火山引擎 DataLeap 數據質量平臺如何滿足多樣的需求? ...
  • 如果你是商家,當你要進行廣告投放的時候,假如平臺推送的用戶都是你潛在的買家,那你就可以花更少的錢,帶來更大的收益。這背後有一項技術支撐,那就是用戶畫像。 ...
  • 本文分享自華為雲社區《GaussDB(DWS)查詢優化技術大揭秘》,作者: 胡辣湯。 大數據時代,數據量呈爆髮式增長,經常面臨百億、千億數據查詢場景,當數據倉庫數據量較大、SQL語句執行效率低時,數據倉庫性能會受到影響。本期《GaussDB(DWS)查詢優化技術大揭秘》的主題直播中,我們邀請到華為雲 ...
  • 現代資料庫系統能夠存儲和處理大量數據。因此,由任何一個用戶單獨負責處理與管理資料庫相關的所有活動的情況相對較少。通常,不同的資料庫用戶需要對資料庫的某些部分具有不同級別的訪問許可權:某些用戶可能只需要讀取特定資料庫中的數據,而其他用戶則必須能夠插入新文檔或修改現有文檔。同樣,應用程式可能需要獨特的許可權 ...
  • C(Chapter) C-01.資料庫概述 1.為什麼要用資料庫 持久化(persistence):把數據保存到可掉電式存儲設備(硬碟)中以供之後使用。大多數情況下,特別是企業應用,數據持久化是將記憶體中的數據保存到硬碟上加以"固化",而持久化的實現過程大多使用各種關係資料庫來完成。 持久化的主要作用 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...