本文分享自華為雲社區《深入理解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開發者能夠提供有益的參考和幫助。