鴻蒙初級考試備忘

Module類型

Module按照使用場景可以分為兩種類型:

Ability類型的Module:
用于實現應用的功能和特性。每一個Ability類型的Module編譯后,會生成一個以.hap為后綴的文件,我們稱其為HAP(Harmony Ability Package)包。HAP包可以獨立安裝和運行,是應用安裝的基本單位,一個應用中可以包含一個或多個HAP包,具體包含如下兩種類型。

  • entry類型的Module:
    應用的主模塊,包含應用的入口界面、入口圖標和主功能特性,編譯后生成entry類型的HAP。每一個應用分發到同一類型的設備上的應用程序包,只能包含唯一一個entry類型的HAP,也可以不包含。
  • feature類型的Module:
    應用的動態特性模塊,編譯后生成feature類型的HAP。一個應用中可以包含一個或多個feature類型的HAP,也可以不包含。
    Library類型的Module
    用于實現代碼和資源的共享。同一個Library類型的Module可以被其他的Module多次引用,合理地使用該類型的Module,能夠降低開發和維護成本。Library類型的Module分為Static和Shared兩種類型,編譯后會生成共享包。
  • Static Library:靜態共享庫
    編譯后會生成一個以.har為后綴的文件,即靜態共享包HAR(Harmony Archive Package)。
  • Shared Library:動態共享庫。
    編譯后會生成一個以.hsp為后綴的文件,即動態共享包HSP(Harmony Shared Package)。

UIAbility組件

UIAbility組件是一種包含UI的應用組件,主要用于和用戶交互。
UIAbility組件是系統調度的基本單元,為應用提供繪制界面的窗口。
一個應用可以包含一個或多個UIAbility組件。例如,在支付應用中,可以將入口功能和收付款功能分別配置為獨立的UIAbility。
每一個UIAbility組件實例都會在最近任務列表中顯示一個對應的任務

UIAbility組件生命周期

  • Create:
    Create狀態為在應用加載過程中,UIAbility實例創建完成時觸發,系統會調用onCreate()回調。可以在該回調中進行頁面初始化操作,例如變量定義資源加載等,用于后續的UI展示。

  • WindowStageCreate:
    UIAbility實例創建完成之后,在進入Foreground之前,系統會創建一個WindowStage。WindowStage創建完成后會進入onWindowStageCreate()回調,可以在該回調中設置UI加載、設置WindowStage的事件訂閱。
    在onWindowStageCreate()回調中通過loadContent()方法設置應用要加載的頁面,并根據需要調用on('windowStageEvent')方法訂閱WindowStage的事件(獲焦/失焦、切到前臺/切到后臺、前臺可交互/前臺不可交互)。
    通過WindowStage對象的loadContent()方法設置啟動頁面。

  • WindowStageWillDestroy
    在onWindowStageWillDestroy()中注銷WindowStage事件訂閱(獲焦/失焦、切到前臺/切到后臺、前臺可交互/前臺不可交互)

  • WindowStageDestroy
    可以在該回調中釋放UI資源。

  • Foreground和Background狀態
    onForeground()回調,在UIAbility的UI可見之前,如UIAbility切換至前臺時觸發。可以在onForeground()回調中申請系統需要的資源,或者重新申請在onBackground()中釋放的資源。
    onBackground()回調,在UIAbility的UI完全不可見之后,如UIAbility切換至后臺時候觸發。可以在onBackground()回調中釋放UI不可見時無用的資源,或者在此回調中執行較為耗時的操作,例如狀態保存等。

  • Destroy
    Destroy狀態在UIAbility實例銷毀時觸發。可以在onDestroy()回調中進行系統資源的釋放、數據的保存等操作。
    UIAbility組件啟動模式
    module.json5配置文件中的launchType:singleton/multiton

  • singleton啟動模式
    singleton啟動模式為單實例模式,也是默認情況下的啟動模式。
    每次調用startAbility()方法時,如果應用進程中該類型的UIAbility實例已經存在,則復用系統中的UIAbility實例。系統中只存在唯一一個該UIAbility實例,即在最近任務列表中只存在一個該類型的UIAbility實例。

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

  • specified啟動模式
    specified啟動模式為指定實例模式,針對一些特殊場景使用(例如文檔應用中每次新建文檔希望都能新建一個文檔實例,重復打開一個已保存的文檔希望打開的都是同一個文檔實例)。

UIAbility組件與UI的數據同步

  • 使用EventHub進行數據通信:在基類Context中提供了EventHub對象,可以通過發布訂閱方式來實現事件的傳遞。在事件傳遞前,訂閱者需要先進行訂閱,當發布者發布事件時,訂閱者將接收到事件并進行相應處理。
import { hilog } from '@kit.PerformanceAnalysisKit';
import { UIAbility, Context, Want, AbilityConstant } from '@kit.AbilityKit';const DOMAIN_NUMBER: number = 0xFF00;
const TAG: string = '[EventAbility]';export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {// 獲取eventHublet eventhub = this.context.eventHub;// 執行訂閱操作eventhub.on('event1', this.eventFunc);eventhub.on('event1', (data: string) => {// 觸發事件,完成相應的業務操作});hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onCreate');}// ...eventFunc(argOne: Context, argTwo: Context): void {hilog.info(DOMAIN_NUMBER, TAG, '1. ' + `${argOne}, ${argTwo}`);return;}
}

根據需要調用eventHub.off()方法取消該事件的訂閱。

  • 使用AppStorage/LocalStorage進行數據同步:ArkUI提供了AppStorage和LocalStorage兩種應用級別的狀態管理方案,可用于實現應用級別和UIAbility級別的數據同步

UIAbility組件間交互(設備內)

當一個應用內包含多個UIAbility時,存在應用內啟動UIAbility的場景。例如在支付應用中從入口UIAbility啟動收付款UIAbility。

  1. 在EntryAbility中,通過調用startAbility()方法啟動UIAbility,want為UIAbility實例啟動的入口參數
let wantInfo: Want = {deviceId: '', // deviceId為空表示本設備bundleName: 'com.samples.stagemodelabilitydevelop',moduleName: 'entry', // moduleName非必選abilityName: 'FuncAbilityA',parameters: {// 自定義信息info: '來自EntryAbility Page_UIAbilityComponentsInteractive頁面'},};// context為調用方UIAbility的UIAbilityContextthis.context.startAbility(wantInfo).then(() => {hilog.info(DOMAIN_NUMBER, TAG, 'startAbility success.');}).catch((error: BusinessError) => {hilog.error(DOMAIN_NUMBER, TAG, 'startAbility failed.');});

在一個EntryAbility啟動另外一個FuncAbility時,希望在被啟動的FuncAbility完成相關業務后,能將結果返回給調用方。
調用startAbilityForResult()接口啟動FuncAbility,異步回調中的data用于接收FuncAbility停止自身后返回給EntryAbility的信息。

context.startAbilityForResult(want).then((data) => {if (data?.resultCode === RESULT_CODE) {// 解析被調用方UIAbility返回的信息let info = data.want?.parameters?.info;hilog.info(DOMAIN_NUMBER, TAG, JSON.stringify(info) ?? '');if (info !== null) {promptAction.showToast({message: JSON.stringify(info)});}}hilog.info(DOMAIN_NUMBER, TAG, JSON.stringify(data.resultCode) ?? '');
}).catch((err: BusinessError) => {hilog.error(DOMAIN_NUMBER, TAG, `Failed to start ability for result. Code is ${err.code}, message is ${err.message}`);
});
  1. 在FuncAbility的onCreate()或者onNewWant()生命周期回調文件中接收EntryAbility傳遞過來的參數。
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';export default class FuncAbilityA extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {// 接收調用方UIAbility傳過來的參數let funcAbilityWant = want;let info = funcAbilityWant?.parameters?.info;}//...
}
  1. 在FuncAbility業務完成之后,如需要停止當前UIAbility實例,在FuncAbility中通過調用terminateSelf()方法實現。
import { common } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';const TAG: string = '[Page_FromStageModel]';
const DOMAIN_NUMBER: number = 0xFF00;@Entry
@Component
struct Page_FromStageModel {build() {Column() {//...Button('FuncAbilityB').onClick(() => {let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; // UIAbilityContext// context為需要停止的UIAbility實例的AbilityContextcontext.terminateSelf((err) => {if (err.code) {hilog.error(DOMAIN_NUMBER, TAG, `Failed to terminate self. Code is ${err.code}, message is ${err.message}`);return;}});})}//...}
}

在FuncAbility停止自身時,需要調用terminateSelfWithResult()方法,入參abilityResult為FuncAbility需要返回給EntryAbility的信息。

context.terminateSelfWithResult(abilityResult, (err) => {if (err.code) {hilog.error(DOMAIN_NUMBER, TAG, `Failed to terminate self with result. Code is ${err.code}, message is ${err.message}`);return;}
});
  1. 如需要關閉應用所有的UIAbility實例,可以調用ApplicationContext的killAllProcesses()方法實現關閉應用所有的進程。

頁面和自定義組件生命周期

頁面生命周期,即被@Entry裝飾的組件生命周期,提供以下生命周期接口:

  • onPageShow:頁面每次顯示時觸發一次,包括路由過程、應用進入前臺等場景。

  • onPageHide:頁面每次隱藏時觸發一次,包括路由過程、應用進入后臺等場景。

  • onBackPress:當用戶點擊返回按鈕時觸發。

組件生命周期,即一般用@Component裝飾的自定義組件的生命周期,提供以下生命周期接口:

  • aboutToAppear:組件即將出現時回調該接口,具體時機為在創建自定義組件的新實例后,在執行其build()函數之前執行。
  • onDidBuild:組件build()函數執行完成之后回調該接口,開發者可以在這個階段進行埋點數據上報等不影響實際UI的功能。不建議在onDidBuild函數中更改狀態變量、使用animateTo等功能,這可能會導致不穩定的UI表現。
  • aboutToDisappear:aboutToDisappear函數在自定義組件析構銷毀之前執行。不允許在aboutToDisappear函數中改變狀態變量,特別是@Link變量的修改可能會導致應用程序行為不穩定
    在這里插入圖片描述
    鏈接
  • 應用冷啟動的初始化流程為:MyComponent aboutToAppear --> MyComponent build -->
    MyComponent onDidBuild–> Child aboutToAppear --> Child build -->
    Child onDidBuild --> Index onPageShow。
  • 退出應用,執行Index onPageHide --> MyComponent aboutToDisappear --> Child
    aboutToDisappear。

NavDestination頁面生命周期

在這里插入圖片描述

  • aboutToAppear:在創建自定義組件后,執行其build()函數之前執行(NavDestination創建之前),允許在該方法中改變狀態變量,更改將在后續執行build()函數中生效。
  • onWillAppear:NavDestination創建后,掛載到組件樹之前執行,在該方法中更改狀態變量會在當前幀顯示生效。
  • onAppear:通用生命周期事件,NavDestination組件掛載到組件樹時執行。
  • onWillShow:NavDestination組件布局顯示之前執行,此時頁面不可見(應用切換到前臺不會觸發)。
  • onShown:NavDestination組件布局顯示之后執行,此時頁面已完成布局。
  • onWillHide:NavDestination組件觸發隱藏之前執行(應用切換到后臺不會觸發)。
  • onHidden:NavDestination組件觸發隱藏后執行(非棧頂頁面push進棧,棧頂頁面pop出棧或應用切換到后臺)。
  • onWillDisappear:NavDestination組件即將銷毀之前執行,如果有轉場動畫,會在動畫前觸發(棧頂頁面pop出棧)。
  • onDisappear:通用生命周期事件,NavDestination組件從組件樹上卸載銷毀時執行。
  • aboutToDisappear:自定義組件析構銷毀之前執行,不允許在該方法中改變狀態變量。

系統路由表

系統路由表不支持預覽器,跨平臺及模擬器。

  1. 在跳轉目標模塊的配置文件module.json5添加路由表配置:
 {"module" : {"routerMap": "$profile:route_map"}}
  1. 添加完路由配置文件地址后,需要在工程resources/base/profile中創建route_map.json文件。添加如下配置信息:
{"routerMap": [{"name": "PageOne","pageSourceFile": "src/main/ets/pages/PageOne.ets","buildFunction": "PageOneBuilder","data": {"description" : "this is PageOne"}}]}
配置項說明
name跳轉頁面名稱。
pageSourceFile跳轉目標頁在包內的路徑,相對src目錄的相對路徑。
buildFunction跳轉目標頁的入口函數名稱,必須以@Builder修飾。
data應用自定義字段。可以通過配置項讀取接口getConfigInRouteMap獲取。
  1. 在跳轉目標頁面中,需要配置入口Builder函數,函數名稱需要和route_map.json配置文件中的buildFunction保持一致,否則在編譯時會報錯
 // 跳轉頁面入口函數@Builderexport function PageOneBuilder() {PageOne()}@Componentstruct PageOne {pathStack: NavPathStack = new NavPathStack()build() {NavDestination() {}.title('PageOne').onReady((context: NavDestinationContext) => {this.pathStack = context.pathStack})}}
  1. 通過pushPathByName等路由接口進行頁面跳轉。(注意:此時Navigation中可以不用配置navDestination屬性)。
@Entry@Componentstruct Index {pageStack : NavPathStack = new NavPathStack();build() {Navigation(this.pageStack){}.onAppear(() => {this.pageStack.pushPathByName("PageOne", null, false);}).hideNavBar(true)}}

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

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

相關文章

語音識別踩坑記錄

本來想在原來的語音識別的基礎上增加本地擴展本地詞典, 采用的語音識別是Vosk識別器,模型是 vosk-model-small-cn-0.22 // 初始化Vosk識別器 if (recognizer null) {using (Model model new Model(modelPath)){string grammar "{""…

SpringCloud 學習筆記1(Spring概述、工程搭建、注冊中心、負載均衡、 SpringCloud LoadBalancer)

文章目錄 SpringCloudSpringCloud 概述集群和分布式集群和分布式的區別和聯系 微服務什么是微服務?分布式架構和微服務架構的區別微服務的優缺點?拆分微服務原則 什么是 SpringCloud ?核心功能與組件 工程搭建父項目的 pom 文件 注冊中心Rest…

計算機網絡-網絡規劃與設計

基本流程 需求分析—》通信規范分析—》邏輯網絡設計—》物理網絡設計—》實施階段 需求分析: 確定需求,包括:業務需求、用戶需求、應用需求、計算機平臺需求、網絡通信需求等。 產物:需求規范 通信規范分析: 現有…

《AI浪潮中的璀璨新星:Meta Llama、Ollama與DeepSeek的深度剖析》:此文為AI自動生成

《AI浪潮中的璀璨新星:Meta Llama、Ollama與DeepSeek的深度剖析》:此文為AI自動生成 引言:AI 大模型的群雄逐鹿時代 在科技飛速發展的當下,AI 大模型領域已成為全球矚目的焦點,競爭激烈程度堪稱白熱化。從 OpenAI 推出…

基礎知識《HTTP字段與狀態碼詳細說明》

HTTP 協議字段與狀態碼完整指南 一、HTTP 字段(請求頭與響應頭) HTTP 頭字段用于傳遞客戶端和服務器之間的元數據,分為 請求頭(Request Headers) 和 響應頭(Response Headers)。 1. 常見請求頭…

DeepSeek linux服務器(CentOS)部署命令筆記

Linux(CentOS)FinalShellOllama遠程訪問,本地部署deepseek 自備CentOS服務器,并且已經使用FinalShell連接到服務器 一、準備工作 1.更新服務器 apt-get update-y 2.下載Ollama curl -fsSL https://ollama.com/install.sh | …

C#通過API接口返回流式響應內容---分塊編碼方式

1、背景 上一篇文章《C#通過API接口返回流式響應內容—SSE方式》闡述了通過SSE(Server Send Event)方式,由服務器端推送數據到瀏覽器。本篇是通過分塊編碼的方式實現 2、效果 3、具體代碼 3.1 API端實現 [HttpGet] public async Task Chu…

SSL 原理及實驗

引言 為了實現遠程辦公或者遠程客戶訪問內網的資源 (1)回顧歷史: 起初先出現SSL(Secure Sockets Layer)-安全套接層協議。 美國網景Netscape公司1994年研發,介于傳輸層TCP協議和應用層協議之間的一種協議…

C++ 布爾類型(bool)深度解析

引言 在 C 編程里,布爾類型(bool)是一種基礎且極為關鍵的數據類型。它專門用于表達邏輯值,在程序的條件判斷、循環控制等諸多方面都發揮著重要作用。接下來,我們將對 C 中的布爾類型展開全面且深入的探討。 一、布爾…

UE5.5 Niagara發射器更新屬性

發射器屬性 在 Niagara 里,Emitter 負責控制粒子生成的規則和行為。不同的 Emitter 屬性決定了如何發射粒子、粒子如何模擬、計算方式等。 發射器 本地空間(Local Space) 控制粒子是否跟隨發射器(Emitter)移動。 ?…

各省水資源平臺 水資源遙測終端機都用什么協議

各個省水資源平臺 水資源遙測終端機 的建設大部分從2012年開始啟動,經過多年建設,基本都已經形成了穩定的通訊要求;河北瑾航科技 遙測終端機,兼容了大部分省市的通訊協議,如果需要,可以咨詢和互相學習&…

使用OpenCV和MediaPipe庫——抽煙檢測(姿態監控)

目錄 抽煙檢測的運用 1. 安全監控 (1) 公共場所禁煙監管 (2) 工業安全 2. 智能城市與執法 (1) 城市違章吸煙檢測 (2) 無人值守管理 3. 健康管理與醫療 (1) 吸煙習慣分析 (2) 遠程監護 4. AI 監控與商業分析 (1) 保險行業 (2) 商場營銷 5. 技術實現 (1) 計算機視…

WPF窗口讀取、顯示、修改、另存excel文件——CAD c#二次開發

效果如下: using System.Data; using System.IO; using System.Windows; using Microsoft.Win32; using ExcelDataReader; using System.Text; using ClosedXML.Excel;namespace IfoxDemo {public partial class SimpleWindow : Window{public SimpleWindow(){Initi…

HarmonyOS NEXT - 電商App實例三( 網絡請求axios)

使用axios開發網絡請求是一個非常常見的任務,尤其是Web前端開發者,對它非常熟悉。axios是一個基于Promise的HTTP客戶端,支持瀏覽器和Node.js環境,使用簡單且功能強大。 在harmonyOS中,如果想使用axios,可以…

生成省市區JSON

省市區 學習記錄 https://xiangyuecn.github.io/AreaCity-JsSpider-StatsGov/ package cn.serverx.sx.your;import cn.hutool.core.io.FileUtil; import cn.serverx.sx.your.vo.DistrictNode; import com.alibaba.fastjson2.JSON; import com.google.common.collect.Lists; i…

醫療APP開發如何實現跨機構數據互通

醫療APP開發如何實現跨機構數據互通 在數字化醫療時代,醫療APP開發已成為連接醫療機構、患者和醫療資源的重要橋梁。然而,如何實現跨機構的數據互通,成為醫療APP開發中的一大挑戰。本文將探討如何通過醫療APP開發實現跨機構數據互通,提升醫療服務效率和患者體驗。我們將涵…

自定義Linux網絡協議的開發與測試

在當今快速發展的技術領域中,定制化網絡協議可以為特定的應用場景提供靈活而強大的解決方案。本文將詳細介紹如何在Linux系統上開發一個自定義網絡協議,并編寫相應的用戶空間程序進行測試。所有步驟基于2025年3月11日的時間點完成。 開發自定義協議內核模塊 定義協議和實現…

PySide(PyQT)的mouseMoveEvent()和hoverMoveEvent()的區別

在 PySide中,mouseMoveEvent 和 hoverMoveEvent 都是用于處理鼠標移動相關操作的事件,但它們之間存在明顯的區別: 事件觸發條件 ? mouseMoveEvent: 當鼠標在對應的圖形項(如 QGraphicsPixmapItem&#xff09…

級聯樹SELECTTREE格式調整

步驟&#xff1a; 1、將全部列表設置成Map<Long, List<Obejct>> map的格式&#xff0c;方便查看每個父級對應的子列表&#xff0c;減少循環次數 2、對這個map進行遞歸&#xff0c;重新進行級聯樹的集合調整&#xff0c;將子集放置在對應的childs里面。 public Dyna…

詳解數據庫范式

范式 1. 第一范式&#xff08;1NF&#xff09;2. 第二范式&#xff08;2NF&#xff09;3. 第三范式&#xff08;3NF&#xff09;4. BC范式&#xff08;BCNF&#xff0c;Boyce-Codd Normal Form&#xff09;5. 第四范式&#xff08;4NF&#xff09;6. 第五范式&#xff08;5NF&a…