鴻蒙HarmonyOS應(yīng)用開(kāi)發(fā)基礎(chǔ)教程 課件 單元6-Stage模型_第1頁(yè)
鴻蒙HarmonyOS應(yīng)用開(kāi)發(fā)基礎(chǔ)教程 課件 單元6-Stage模型_第2頁(yè)
鴻蒙HarmonyOS應(yīng)用開(kāi)發(fā)基礎(chǔ)教程 課件 單元6-Stage模型_第3頁(yè)
鴻蒙HarmonyOS應(yīng)用開(kāi)發(fā)基礎(chǔ)教程 課件 單元6-Stage模型_第4頁(yè)
鴻蒙HarmonyOS應(yīng)用開(kāi)發(fā)基礎(chǔ)教程 課件 單元6-Stage模型_第5頁(yè)
已閱讀5頁(yè),還剩56頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

單元6Stage模型《鴻蒙應(yīng)用開(kāi)發(fā)基礎(chǔ)教程(HarmonyOS)》應(yīng)用模型概述Stage模型HarmonyOS早期版本開(kāi)始支持的模型,已經(jīng)不再主推。FA(FeatureAbility)模型FA模型中,每個(gè)應(yīng)用組件獨(dú)享一個(gè)ArkTS引擎實(shí)例FA(FeatureAbility)模型HarmonyOS3.1DeveloperPreview版本開(kāi)始新增的模型。在該模型中,由于提供了AbilityStage、WindowStage等類作為應(yīng)用組件和Window窗口的“舞臺(tái)”,因此稱這種應(yīng)用模型為Stage模型。Stage模型Stage模型中,多個(gè)應(yīng)用組件共享同一個(gè)ArkTS引擎實(shí)例。Stage模型介紹采用面向?qū)ο蟮姆绞?,將?yīng)用組件以類接口的形式開(kāi)放給開(kāi)發(fā)者,可以進(jìn)行派生,利于擴(kuò)展能力應(yīng)用中(同一包名)的所有UIAbility運(yùn)行在同一個(gè)獨(dú)立進(jìn)程中。WebView擁有獨(dú)立的渲染進(jìn)程。使用app.json5描述應(yīng)用信息,module.json5描述HAP信息、應(yīng)用組件信息。Stage模型介紹Stage模型基本概念UIAbility組件簡(jiǎn)介UIAbilityUIAbility組件是一種包含UI界面的應(yīng)用組件,主要用于和用戶交互。UIAbility組件是系統(tǒng)調(diào)度的基本單元,為應(yīng)用提供窗口在其中繪制界面。一個(gè)UIAbility組件中可以通過(guò)多個(gè)頁(yè)面來(lái)實(shí)現(xiàn)一個(gè)功能模塊,即將一個(gè)獨(dú)立的功能模塊放到一個(gè)UIAbility中,以多頁(yè)面的形式呈現(xiàn)。新建UIAbility組件的流程01創(chuàng)建UIAbilityNew->Ability02新建頁(yè)面文件New->Page03指定UIAbility加載Page頁(yè)面windowStage.loadContent()04修改配置文件module.json5:指定啟動(dòng)入口、設(shè)置圖標(biāo)、標(biāo)簽。代碼演示windowStage.loadContent('pages/SamplePage',

(err,

data)

=>

{

if

(err.code)

{

...

}

});代碼演示{"abilities":[{"name":"SampleAbility",//UIAbility組件的名稱"icon":"$media:icon",//UIAbility組件的圖標(biāo)"label":"$string:SampleAbility_label",//UIAbility組件的標(biāo)簽"skills":[{"entities":["entity.system.home"],"actions":["action.system.home"]}]}]}}Stage模型中,AbilityStage負(fù)責(zé)創(chuàng)建UIAbility,然后UIAbility進(jìn)入其生命周期UIAbility的生命周期狀態(tài)包括創(chuàng)建、銷毀、前臺(tái)、后臺(tái)。當(dāng)用戶打開(kāi)、切換和返回對(duì)應(yīng)的應(yīng)用界面時(shí),UIAbility會(huì)在生命周期不同狀態(tài)之間轉(zhuǎn)換。UIAbility生命周期概述UIAbility生命周期狀態(tài)CreateForeground應(yīng)用首次創(chuàng)建UIAbility實(shí)例時(shí),處于創(chuàng)建狀態(tài)當(dāng)應(yīng)用界面處于活躍狀態(tài)時(shí),它處于前臺(tái)狀態(tài)BackgroundDestroyUIAbility實(shí)例切換至后臺(tái)時(shí),進(jìn)入后臺(tái)狀態(tài)關(guān)閉應(yīng)用或者應(yīng)用被系統(tǒng)銷毀時(shí),處于Destroy狀態(tài)UIAbility生命周期狀態(tài)轉(zhuǎn)換UIAbility生命周期狀態(tài)轉(zhuǎn)換從桌面點(diǎn)擊圖庫(kù)應(yīng)用圖標(biāo),到啟動(dòng)圖庫(kù)應(yīng)用,應(yīng)用的狀態(tài)經(jīng)過(guò)了從創(chuàng)建到前臺(tái)展示的狀態(tài)變化。再切換到桌面,應(yīng)用的狀態(tài)經(jīng)過(guò)了從前臺(tái)到后臺(tái)的狀態(tài)變化。從最近任務(wù)列表,切換回圖庫(kù)應(yīng)用,應(yīng)用的狀態(tài)又經(jīng)過(guò)了從后臺(tái)到前臺(tái)展示的狀態(tài)變化。01onCreate()UIAbility實(shí)例創(chuàng)建完成時(shí)調(diào)用該函數(shù),常用來(lái)進(jìn)行應(yīng)用初始化操作02onForeground()在UIAbility的UI界面可見(jiàn)之前調(diào)用該函數(shù),常用于申請(qǐng)系統(tǒng)需要的資源03onBackground()在UIAbility的UI界面完全不可見(jiàn)之后調(diào)用該函數(shù),用于釋放無(wú)用的資源,或者執(zhí)行較為耗時(shí)的操作。04onDestroy()UIAbility實(shí)例銷毀時(shí)調(diào)用該函數(shù),用于系統(tǒng)資源的釋放、數(shù)據(jù)的保存等操作。UIAbility生命周期函數(shù)UIAbility生命周期函數(shù)和WindowStage關(guān)系代碼演示

exportdefaultclassEntryAbilityextendsUIAbility{

onCreate(want,launchParam){(0x0000,'testTag','%{public}s','調(diào)用了onCreate()方法');}

}Context提供了應(yīng)用的一些基礎(chǔ)信息以及應(yīng)用的一些基本方法Context獲取資源、啟動(dòng)能力、創(chuàng)建或獲取任務(wù)調(diào)度程序,以及有關(guān)應(yīng)用程序的捆綁和運(yùn)行信息UIAbility組件和各種ExtensionAbility派生類組件都有各自不同的Context類Context簡(jiǎn)介獲取Context對(duì)象01this.context在UIAbility中獲取UIAbilityContext02getContext(this)ets頁(yè)面中獲取UIAbilityContext03this.context在AbilityStage中獲取Context04this.context.getApplicationContext()獲取應(yīng)用級(jí)別的Context

代碼演示

exportdefaultclassEntryAbilityextendsUIAbility{

onCreate(want,launchParam){

letuiAbilityContext=this.context;letcacheDir=uiAbilityContext.cacheDir;lettempDir=uiAbilityContext.tempDir;letfilesDir=uiAbilityContext.filesDir;letdatabaseDir=uiAbilityContext.databaseDir;letpreferencesDir=uiAbilityContext.preferencesDir;}

}Want是對(duì)象間信息傳遞的載體,作為startAbility()的參數(shù)Want對(duì)象內(nèi)部是JSON格式的鍵-值對(duì),包含了指定的啟動(dòng)目標(biāo)以及啟動(dòng)時(shí)需攜帶的相關(guān)數(shù)據(jù)Want簡(jiǎn)介啟動(dòng)UIAbility有顯式Want啟動(dòng)和隱式Want啟動(dòng)兩種方式隱式WantVS顯式Want顯式Want與隱式Want開(kāi)發(fā)者需要啟動(dòng)某個(gè)明確的UIAbility時(shí),通常使用顯式Want啟動(dòng)方式。在want參數(shù)中需要設(shè)置該應(yīng)用的bundleName和abilityName。開(kāi)發(fā)者通常不知道用戶設(shè)備中應(yīng)用的安裝情況,也無(wú)法確定目標(biāo)應(yīng)用的bundleName和abilityName,通常使用隱式Want啟動(dòng)方式。Want中指定了一系列的entities字段和actions字段等參數(shù)信息,由系統(tǒng)去分析want,并幫助找到合適的UIAbility來(lái)啟動(dòng)。匹配規(guī)則匹配規(guī)則就是調(diào)用方Want中設(shè)置的參數(shù)如何與目標(biāo)Ability聲明的配置文件進(jìn)行匹配。調(diào)用方傳入的want參數(shù),表明調(diào)用方需要執(zhí)行的操作,并提供相關(guān)數(shù)據(jù)以及其他應(yīng)用類型限制。待匹配Ability的skills配置,聲明其具備的能力(module.json5配置文件中的skills標(biāo)簽參數(shù))。匹配規(guī)則匹配規(guī)則匹配規(guī)則創(chuàng)建顯式Want創(chuàng)建顯式Want啟動(dòng)Abilityletcontext=getContext(this)asany;context.startAbility(wantInfo);letwantInfo={deviceId:'',//deviceId為空表示本設(shè)備bundleName:'com.example.myapplication',abilityName:'OtherAbility',}創(chuàng)建隱式Want

瀏覽器應(yīng)用中通過(guò)module.json5配置"skills":[{"entities":["entity.system.browsable"],"actions":["ohos.want.action.viewData"],"uris":[{"scheme":"https","host":"","port":"8080","pathStartWith":"query","type":"text/*"},{"scheme":"http",}]}]創(chuàng)建隱式Want創(chuàng)建隱式Want啟動(dòng)Abilityletcontext=getContext(this)asany;

context.startAbility(wantInfo);letwant={"action":"ohos.want.action.viewData","entities":["entity.system.browsable"],"uri":":8080/query/student","type":"text/plain"}代碼演示.onClick((event:ClickEvent)=>{letwantInfo={deviceId:'',//deviceId為空表示本設(shè)備bundleName:'com.example.unit6_wantdemo',abilityName:'ImageAbility',}this.context.startAbility(wantInfo);//顯式Want跳轉(zhuǎn)到顯示圖像界面})代碼演示letwantInfo={"deviceId":"","bundleName":"","abilityName":"","uri":"","type":"image/*","action":"ent.action.GET_CONTENT","parameters":{},"entities":[]}this.context.startAbility(wantInfo)UIAbility的啟動(dòng)模式是指UIAbility實(shí)例在啟動(dòng)時(shí)的不同呈現(xiàn)狀態(tài)UIAbility當(dāng)前支持singleton、multiton和specified3種啟動(dòng)模式不同啟動(dòng)模式適合不一樣的應(yīng)用場(chǎng)景,如:應(yīng)用中展示的主頁(yè)只有一個(gè),采用singleton啟動(dòng)模式。啟動(dòng)模式簡(jiǎn)介啟動(dòng)模式分類singletonmultiton默認(rèn)的啟動(dòng)模式,系統(tǒng)中只存在唯一一個(gè)該類型的UIAbility實(shí)例每次調(diào)用startAbility()方法時(shí),都會(huì)在應(yīng)用進(jìn)程中創(chuàng)建一個(gè)新的該類型UIAbility實(shí)例specified為實(shí)例創(chuàng)建一個(gè)唯一的字符串Key,調(diào)用startAbility()方法時(shí),如果匹配有該UIAbility實(shí)例的Key,則直接使用存在的UIAbility實(shí)例,否則創(chuàng)建一個(gè)新的UIAbility實(shí)例代碼演示{"module":{"abilities":[{"launchType":"singleton",//...}]}}代碼實(shí)現(xiàn){"module":{"abilities":[{"launchType":"multiton",//...}]}}代碼實(shí)現(xiàn){"module":{"abilities":[{"launchType":"specified",//...}]}}案例分析啟動(dòng)模式應(yīng)用主頁(yè)只有一個(gè),采用singleton啟動(dòng)模式。普通頁(yè)面,每次打開(kāi)都創(chuàng)建一個(gè)新的實(shí)例,采用multiton啟動(dòng)模式。每次新建文檔時(shí),希望都能新建一個(gè)文檔實(shí)例,重復(fù)打開(kāi)一個(gè)已保存的文檔時(shí),希望打開(kāi)的都是同一個(gè)文檔實(shí)例,此時(shí),采用specified啟動(dòng)模式較適合。配置啟動(dòng)模式主頁(yè)面啟動(dòng)模式:singleton文檔頁(yè)面啟動(dòng)模式:specified{"module":{"abilities":[{"name":"HomeAbility","launchType":"singleton",},{"name":"NormalAbility","launchType":"multiton",},{"name":"DocumentAbility","launchType":"specified",}]}}普通頁(yè)面啟動(dòng)模式:multiton配置StageHAP在首次加載時(shí)會(huì)創(chuàng)建一個(gè)MyAbilityStage實(shí)例{"module":{"name":"entry","type":"entry","srcEntry":"./ets/myabilitystage/MyAbilityStage.ts",...}}代碼演示Button("新建一個(gè)文檔").onClick(()=>{letwant2={deviceId:'',//deviceId為空表示本設(shè)備bundleName:'com.example.unit6_launchmodedemo',abilityName:'DocumentAbility',}letcontext=getContext(this)asany;//獲取當(dāng)前component關(guān)聯(lián)的contextcontext.startAbility(want2);})代碼演示Button("打開(kāi)已保存文檔").onClick(()=>{

functiongetInstance(){return'wendang1';}letwant3={deviceId:'',bundleName:'com.example.unit6_launchmodedemo',abilityName:'DocumentAbility',

parameters:{//自定義信息instanceKey:getInstance(),},}

代碼演示exportdefaultclassMyAbilityStageextendsAbilityStage{onAcceptWant(want){//僅specified模式下觸發(fā)if(want.abilityName==='DocumentAbility'){//返回的字符串Key標(biāo)識(shí)為自定義拼接的字符串內(nèi)容if(want.parameters.instanceKey!=undefined){return`DocumentAbilityAbilityInstance_${want.parameters.instanceKey}`;}else{return'';}}return'';}

使用EventHub和globalThis實(shí)現(xiàn)UIAbility組件與UI之間的數(shù)據(jù)同步EventHub以UIAbility組件為中心提供了訂閱、取消訂閱和觸發(fā)事件的數(shù)據(jù)通信能力基于發(fā)布訂閱模式來(lái)實(shí)現(xiàn),事件需要先訂閱后發(fā)布,訂閱者收到消息后進(jìn)行處理EventHub簡(jiǎn)介EventHub實(shí)現(xiàn)數(shù)據(jù)同步01獲取EventHub對(duì)象this.context.eventHub;02訂閱事件eventhub.on("doRegister",this.func1);03觸發(fā)事件eventHub.emit("doRegister",...)04取消訂閱eventHub.off("doRegister")代碼演示onCreate(want,launch){leteventhub=this.context.eventHub;eventhub.on("doRegister",this.func1);//執(zhí)行訂閱操作}func1(...data){(0x0000,'testTag','%{public}s','接收到頁(yè)面?zhèn)鞯臄?shù)據(jù)'+JSON.stringify(data));}代碼演示Button("使用EventHub傳數(shù)據(jù)給EntryAbility",{type:ButtonType.Normal,stateEffect:true}).onClick(()=>{this.context.eventHub.emit("doRegister","admin","male",21)//觸發(fā)事件

})代碼演示onDestroy(){

//取消訂閱this.context.eventHub.off("doRegister");}使用globalThis實(shí)現(xiàn)UIAbility組件與UI之間的數(shù)據(jù)同步globalThis是ArkTS引擎實(shí)例內(nèi)部的一個(gè)全局對(duì)象,引擎內(nèi)部的UIAbility/Page都可以使用globalThis使用簡(jiǎn)單,但可能會(huì)帶來(lái)一些安全風(fēng)險(xiǎn),應(yīng)該謹(jǐn)慎使用globalThis簡(jiǎn)介取值VS傳值globalThis實(shí)現(xiàn)數(shù)據(jù)同步globalThis.變量名="變量值";result=globalThis.變量名;代碼演示onCreate(want,launch){globalThis.result="注冊(cè)成功";//使用globalThis傳參//...}代碼演示Button("使用globalThis獲取EntryAbility傳的數(shù)據(jù)").onClick(()=>{result=globalThis.result;//獲取result參數(shù)this.handlePopup=!this.handlePopup}).bindPopup(this.handlePopup,{message:'獲取EntryAbility傳的數(shù)據(jù):'+result,})UIAbilityBVSUIAbilityAUIAbility組件間傳值letwantInfo={deviceId:'',

bundleName:'',abilityName:'UIAbilityB',

parameters:{//自定義信息name,"lihua",//傳值信息}}

this.context.startAbility(wantInfo)exportdefaultclassUIAbilityB

extendsUIAbility{onCreate(want,launchParam){

letinfo=want?.parameters?.name;

}UIAbilityBVSUIAbilityA啟動(dòng)UIAbility并獲取返回結(jié)果letwantInfo={

bundleName:'',abilityName:'UIAbilityB',}this.context.startAbilityForResult(wantInfo).then((data)=>{if(data?.resultCode===RESULT_CODE){//解析被調(diào)用方UIAbility返回的信息letpayResult=data.want?.parameters?.payResult;

}})})letabilityResult={resultCode:RESULT_CODE,

want:{bundleName:'',abilityName:'UIAbilityA',

parameters:{

payResult:'OKay',},},}this.context.terminateSelfWithResult(abilityResult,(err)=>{//...});UIAbilityBVSUIAbilityA啟動(dòng)UIAbility的指定頁(yè)面letwantInfo={deviceId:'',

bundleName:'',abilityName:'UIAbilityB',

parameters:{router:'guide',},}this.context.startAbility(wantInfo).then(()=>{//...}).catch((err)=>{//...})onCreate(want,launchParam){this.mainAbilityWant=want;}onWindowStageCreate(windowStage:

Window.WindowStage){leturl='pages/MainPage';if(this.mainAbilityWant?.parameters?.router){if(this.mainAbilityWant.parameters.router==='guide'){url='pages/GuidePage';}}

windowStage.loadContent(url,(err,data)=>{});}案例分析啟動(dòng)UIAbility的指定頁(yè)面在EntryAbility中判斷用戶是否是第一次進(jìn)入app如果是第一次進(jìn)入,則跳轉(zhuǎn)到引導(dǎo)頁(yè)面如果不是第一次進(jìn)入,則跳轉(zhuǎn)到主頁(yè)面MainAbilityVSEntryAbility啟動(dòng)UIAbility的指定頁(yè)面

onCreate(want,launchParam){letwantInfo={

bundleName:'',abilityName:'MainAbility',parameters:{

router:'guide',}

}this.context.startAbility(wantInfo)}url="pages/MainPage";onWindowStageCreate(windowStage:window.WindowStage){if(this.mainAbilityWant?.parameters?.router){if(this.mainAbilityWant.parameters.router==='guide'){this.url='pages/GuidePage';}}}代碼演示onCreate(want,launchParam){letwantInfo={deviceId:'',bundleName:'com.example.unit6_comdatasyncdemo',abilityName:'MainAbility',

parameters:{//自定義參數(shù)傳遞頁(yè)面信息router:'guide',}}//context為調(diào)用方UIAbility的AbilityContext

this.context.startAbility(wantInfo).then(()=>{//...}).catch((err)=>{//...})}

代碼演示url="pages/MainPage";onWindowStageCreate(windowStage:window.WindowStage){if(this.mainAbilityWant?.parameters?.router){if(this.mainAbilityWant.parameters.router==='guide'){

this.url='pages/GuidePage';}}}案例分析啟動(dòng)UIAbility并獲取返回結(jié)果點(diǎn)擊“登錄”圖標(biāo),跳轉(zhuǎn)到登錄頁(yè)面登錄頁(yè)面,進(jìn)行登錄驗(yàn)證登錄成功后返回主頁(yè),同時(shí)返回輸入正確的用戶名LoginAb

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論