【HarmonyOS 5】鴻蒙中的UIAbility詳解(一)

【HarmonyOS 5】鴻蒙中的UIAbility詳解(一)

一、UIAbility是什么?

Stage模型中的組件類型名,即UIAbility組件,包含UI,提供展示UI的能力,主要用于和用戶交互。

UIAbility類似于傳統移動開發Android中的Activity或者Fragment。類似IOS開發中的 UIViewController。

UIAbility 是 HarmonyOS 應用框架的核心組件,負責管理應用的用戶界面生命周期和上下文信息。

二、設置指定啟動頁面

啟動頁面必須設置:否則應用啟動后會白屏。

避免應用啟動后白屏,需在onWindowStageCreate生命周期中設置默認加載頁面。通過WindowStageloadContent()方法指定頁面路徑。

export default class EntryAbility extends UIAbility {onWindowStageCreate(windowStage: window.WindowStage): void {windowStage.loadContent('pages/Index', (err, data) => { /* 處理回調 */ });}
}

DevEco Studio默認生成的項目會自動加載Index頁面,可按需修改路徑。

三、獲取上下文信息(UIAbilityContext)

獲取應用配置信息(如包名、Ability名稱等),或調用操作Ability的方法(如啟動、終止Ability)。通過this.context直接訪問。

export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {const context = this.context; // 直接獲取上下文}
}

在頁面組件中獲取
通過getUIContext().getHostContext()轉換為UIAbilityContext

@Entry
@Component
struct Page {private context = this.getUIContext().getHostContext() as common.UIAbilityContext;startAbilityTest() { this.context.startAbility(want); } // 啟動其他Ability
}
啟動頁面設置與上下文使用代碼示例
// UIAbility定義
export default class EntryAbility extends UIAbility {onWindowStageCreate(windowStage: window.WindowStage) {windowStage.loadContent('pages/Main', () => {}); // 設置啟動頁面}onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {const context = this.context; // 獲取上下文context.startAbility({ abilityName: 'OtherAbility' }); // 啟動其他Ability}
}// 頁面組件中使用上下文
@Entry
@Component
struct MainPage {private context = this.getUIContext().getHostContext() as common.UIAbilityContext;build() {Button('終止當前Ability').onClick(() => this.context.terminateSelf());}
}

四、UIAbility生命周期與操作

UIAbility的生命周期包含 Create(創建)、Foreground(前臺)、Background(后臺)、Destroy(銷毀) 四個核心狀態,以及與窗口(WindowStage)相關的子狀態。通過生命周期回調鉤子函數,可監聽狀態變化并執行對應操作。

生命周期狀態流轉圖

創建實例          窗口創建       進入前臺         切到后臺         窗口銷毀       實例銷毀↓               ↓             ↓               ↓               ↓             ↓
onCreate() → onWindowStageCreate() → onForeground() → onBackground() → onWindowStageDestroy() → onDestroy()↑       ↖                ↗                ↖                ↑└─────── WindowStageWillDestroy() ────────────────────────┘
1、onCreate

UIAbility實例創建完成時觸發。初始化頁面數據、加載資源(如定義變量、獲取上下文this.context)。

export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {// 初始化操作(如獲取上下文、配置數據)const context = this.context; }
}
2、WindowStageCreate

UIAbility實例創建后,進入前臺前,系統創建WindowStage時觸發。設置啟動頁面(loadContent())、訂閱窗口事件(如前后臺切換、焦點變化)。

onWindowStageCreate(windowStage: window.WindowStage) {windowStage.loadContent('pages/Index'); // 設置啟動頁面windowStage.on('windowStageEvent', (event) => { // 訂閱窗口事件switch (event) {case window.WindowStageEventType.SHOWN: // 切到前臺console.log('窗口切到前臺');break;}});}
3、WindowStageWillDestroy

WindowStage銷毀前觸發(此時窗口仍可用)。釋放通過WindowStage獲取的資源,注銷事件訂閱(off('windowStageEvent'))。

4、WindowStageDestroy

WindowStage銷毀時觸發(UI資源釋放)。釋放UI相關資源(如臨時文件、圖形對象)。

5、Foreground

UIAbility切換至前臺、UI可見前觸發。申請系統資源(如定位、傳感器權限)、恢復后臺釋放的資源。

    onForeground() {// 開啟定位功能location.start(); }
6、Background

UIAbility切換至后臺、UI完全不可見后觸發。釋放無用資源、執行耗時操作(如數據持久化)。

    onBackground() {// 停止定位、保存當前狀態location.stop(); saveDataToLocal();}
7、onDestroy

UIAbility實例被終止時觸發(如調用terminateSelf())。釋放全局資源、清理內存(如關閉網絡連接、注銷監聽器)。

onDestroy() {// 釋放數據庫連接、取消定時器db.close(); clearInterval(timer);
}

注意:API 13+中,若用戶通過最近任務一鍵清理應用,不會觸發onDestroy(),而是直接終止進程。

四、UIAbility的常用函數操作

1. 終止UIAbility實例

調用terminateSelf()終止當前Ability。

context.terminateSelf((err) => {if (err) { console.error('終止失敗:', err); } else { console.info('終止成功'); }
});
2. 獲取拉起方信息

當UIAbilityA通過startAbility啟動UIAbilityB時,UIAbilityB可獲取調用方信息。

export default class UIAbilityB extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {console.log(`調用方Pid: ${want.parameters?.['ohos.aafwk.param.callerPid']}`);}
}
跨Ability信息傳遞代碼示例
// UIAbilityA中啟動UIAbilityB
@Entry
@Component
struct UIAbilityAPage {private context = this.getUIContext().getHostContext() as common.UIAbilityContext;build() {Button('拉起UIAbilityB').onClick(() => {this.context.startAbility({ bundleName: this.context.abilityInfo.bundleName, abilityName: 'UIAbilityB' });});}
}// UIAbilityB中獲取調用方信息
export default class UIAbilityB extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {console.log(`調用方包名: ${want.parameters?.['ohos.aafwk.param.callerBundleName']}`);}
}

注意

當UIAbility設置為singleton啟動模式時,重復調用startAbility()啟動同一實例,不會重新走onCreateonWindowStageCreate流程,而是觸發onNewWant回調。

onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam) {// 根據新的Want參數更新頁面數據this.data = want.parameters?.data; 
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82376.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82376.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82376.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Transformer預訓練模型微調技術全解析

引言:Transformer預訓練模型與微調的浪潮 近年來,人工智能領域取得了令人矚目的成就,特別是在自然語言處理(NLP)方面。引領這場變革的核心技術之一便是Transformer架構。自2017年 Vaswani 等人在論文 "Attention Is All You Need" 中提出以來,Transformer憑借…

《算法筆記》12.2小節——字符串專題->KMP算法 問題 C: 剪花布條

題目描述 一塊花布條,里面有些圖案,另有一塊直接可用的小飾條,里面也有一些圖案。對于給定的花布條和小飾條,計算一下能從花布條中盡可能剪出幾塊小飾條來呢? 輸入 輸入中含有一些數據,分別是成對出現的…

實現一個前端動態模塊組件(Vite+原生JS)

1. 引言 在前面的文章《使用Vite創建一個動態網頁的前端項目》中我們實現了一個動態網頁。不過這個動態網頁的實用價值并不高,在真正實際的項目中我們希望的是能實現一個動態的模塊組件。具體來說,就是有一個頁面控件同時在多個頁面中使用,那…

NTFS0x90屬性和0xa0屬性和0xb0屬性的一一對應關系是index_entry中的index_node中VCN和runlist和bitmap

第一部分: 0: kd> dt _FILE_RECORD_SEGMENT_HEADER 0xc1241400 Ntfs!_FILE_RECORD_SEGMENT_HEADER 0x000 MultiSectorHeader : _MULTI_SECTOR_HEADER 0x008 Lsn : _LARGE_INTEGER 0x80e74aa 0x010 SequenceNumber : 5 0x012 Referen…

PCB 通孔是電容性的,但不一定是電容器

哼?……這是什么意思?…… 多年來,流行的觀點是 PCB 通孔本質上是電容性的,因此可以用集總電容器進行建模。雖然當信號的上升時間大于或等于過孔不連續性延遲的 3 倍時,這可能是正確的,但我將向您展示為什…

Flutter 3.32 新特性

2天前,Flutter發布了最新版本3.32,我們來一起看下29到32有哪些變化。 簡介 歡迎來到Flutter 3.32!此版本包含了旨在加速開發和增強應用程序的功能。準備好在網絡上進行熱加載,令人驚嘆的原生保真Cupertino,以及與Fir…

漢諾塔超級計算機數據區結構和源代碼詳細設計

### 數據區結構與源代碼詳細設計 基于"滿秩二叉樹"存儲模型的設計理念,我設計了以下數據區結構和實現方案: #### 1. 滿秩二叉樹存儲模型 **數據結構設計**: python class TreeNode: """二叉樹節點結構&#xff0c…

GitHub Copilot 現已支持 AI Coding Agent

VS Code 開始越來越像 Cursor 和 WindSurf 了。 這周,GitHub 發布了一個新的編程代理,直接嵌入到 GitHub 中。當你將 GitHub 問題分配給 Copilot 或在 VS Code 中提示它時,該代理會啟動一個由 GitHub Actions 驅動的安全且完全可定制的開發環境。 這一公告來自微軟首席執行…

【辰輝創聚生物】FGF信號通路相關蛋白:解碼生命調控的關鍵樞紐

在生命科學的探索旅程中,成纖維細胞生長因子(Fibroblast Growth Factor,FGF)信號通路猶如精密儀器中的核心齒輪,驅動著眾多生命活動的有序進行。FGF 信號通路相關蛋白作為該通路的重要組成部分,其結構與功能…

算法的學習筆記— 構建乘積數組(牛客JZ66)

構建乘積數組 1. 問題背景與描述 1.1 題目來源與鏈接 本題來源于NowCoder在線編程平臺,是劍指Offer系列面試題中的經典問題。題目鏈接為:NowCoder。該問題在算法面試中出現頻率較高,主要考察數組操作和數學思維。 1.2 問題描述與要求 給…

SpringBoot+ELK 搭建日志監控平臺

ELK 簡介 ELK(Elasticsearch, Logstash, Kibana)是一個目前主流的開源日志監控平臺。由三個主要組件組成的: Elasticsearch: 是一個開源的分布式搜索和分析引擎,可以用于全文檢索、結構化檢索和分析,它構建…

python36

仔細回顧一下神經網絡到目前的內容,沒跟上進度的同學補一下進度。 作業:對之前的信貸項目,利用神經網絡訓練下,嘗試用到目前的知識點讓代碼更加規范和美觀。 # 先運行之前預處理好的代碼 import pandas as pd import pandas as pd…

SGlang 推理模型優化(PD架構分離)

一、技術背景 隨著大型語言模型(LLM)廣泛應用于搜索、內容生成、AI助手等領域,對模型推理服務的并發能力、響應延遲和資源利用效率提出了前所未有的高要求。與模型訓練相比,推理是一個持續進行、資源消耗巨大的任務,尤…

模型實戰(28)之 yolov5分類模型 訓練自己的數據集

模型實戰(28)之 yolov5分類模型 訓練自己的數據集 本文以手寫數字數據集為例總結YOLO分類模型如何訓練自己的數據集,關于數據集的預處理可以看這篇:https://blog.csdn.net/yohnyang/article/details/148209978?spm=1001.2014.3001.5502 yolov5曾是在 2021-2023 年十分流行…

醫學寫作人才管理策略

1. 人才選擇:精準定位核心能力 1.1 人才篩選標準 1.1.1 硬性要求 初創生物制藥公司醫學寫作崗位對專業背景要求嚴格,候選人需具備醫學、藥學或生物學碩士及以上學歷,博士優先。同時,熟悉ICH、FDA/EMA等法規指南是必備條件,且至少有1-3年醫學寫作經驗,或相關領域如臨床研…

Axure酒店管理系統原型

酒店管理系統通常被設計為包含多個模塊或界面,以支持酒店運營的不同方面和參與者。其中,管理端和商戶端是兩個核心組成部分,它們各自承擔著不同的職責和功能。 軟件版本:Axure RP 9 預覽地址:https://556i1e.axshare.…

云原生安全之HTTP協議:從基礎到實戰的安全指南

🔥「炎碼工坊」技術彈藥已裝填! 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 一、基礎概念:HTTP協議的核心要素 HTTP(HyperText Transfer Protocol)是云原生應用中客戶端與服務器通信的基礎協議&a…

怎樣解決photoshop閃退問題

檢查系統資源:在啟動 Photoshop 之前,打開任務管理器檢查 CPU 和內存的使用情況。如果發現資源占用過高,嘗試關閉不必要的程序或重啟計算機以釋放資源。更新 Photoshop 版本:確保 Photoshop 是最新版本。Adobe 經常發布更新以修復…

修復ubuntu server筆記本合蓋導致的無線網卡故障

下班回到家發現走時還好的局域網 ubuntu server 24 連不上了,趕緊打開筆記本查看下原因,發現控制臺出了一堆看不懂的內容: 根據搜索結果,筆記本合蓋導致無線網卡故障可能與電源管理設置和系統休眠策略有關,以下是具體…

CMake指令:find_package()在Qt中的應用

目錄 1.簡介 2.Qt 核心組件與常用模塊 3.配置模式的工作流程 4.完整示例:構建 Qt GUI 應用 5.常見問題與解決方案 6.總結 1.簡介 在 CMake 中使用 find_package(Qt) 是集成 Qt 庫的核心步驟。Qt 從 5.x 版本開始全面支持 配置模式(Config Mode&…