鴻蒙HarmonyOS應用開發基礎教程 課件 劉正 單元6-Stage模型;單元7-服務卡片_第1頁
鴻蒙HarmonyOS應用開發基礎教程 課件 劉正 單元6-Stage模型;單元7-服務卡片_第2頁
鴻蒙HarmonyOS應用開發基礎教程 課件 劉正 單元6-Stage模型;單元7-服務卡片_第3頁
鴻蒙HarmonyOS應用開發基礎教程 課件 劉正 單元6-Stage模型;單元7-服務卡片_第4頁
鴻蒙HarmonyOS應用開發基礎教程 課件 劉正 單元6-Stage模型;單元7-服務卡片_第5頁
已閱讀5頁,還剩94頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

(err,

data)

=>

{

if

(err.code)

{

...

}

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

exportdefaultclassEntryAbilityextendsUIAbility{

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

}Context提供了應用的一些基礎信息以及應用的一些基本方法Context獲取資源、啟動能力、創建或獲取任務調度程序,以及有關應用程序的捆綁和運行信息UIAbility組件和各種ExtensionAbility派生類組件都有各自不同的Context類Context簡介獲取Context對象01this.context在UIAbility中獲取UIAbilityContext02getContext(this)ets頁面中獲取UIAbilityContext03this.context在AbilityStage中獲取Context04this.context.getApplicationContext()獲取應用級別的Context

代碼演示

exportdefaultclassEntryAbilityextendsUIAbility{

onCreate(want,launchParam){

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

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

瀏覽器應用中通過module.json5配置"skills":[{"entities":["entity.system.browsable"],"actions":["ohos.want.action.viewData"],"uris":[{"scheme":"https","host":"","port":"8080","pathStartWith":"query","type":"text/*"},{"scheme":"http",}]}]創建隱式Want創建隱式Want啟動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為空表示本設備bundleName:'com.example.unit6_wantdemo',abilityName:'ImageAbility',}this.context.startAbility(wantInfo);//顯式Want跳轉到顯示圖像界面})代碼演示letwantInfo={"deviceId":"","bundleName":"","abilityName":"","uri":"","type":"image/*","action":"ent.action.GET_CONTENT","parameters":{},"entities":[]}this.context.startAbility(wantInfo)UIAbility的啟動模式是指UIAbility實例在啟動時的不同呈現狀態UIAbility當前支持singleton、multiton和specified3種啟動模式不同啟動模式適合不一樣的應用場景,如:應用中展示的主頁只有一個,采用singleton啟動模式。啟動模式簡介啟動模式分類singletonmultiton默認的啟動模式,系統中只存在唯一一個該類型的UIAbility實例每次調用startAbility()方法時,都會在應用進程中創建一個新的該類型UIAbility實例specified為實例創建一個唯一的字符串Key,調用startAbility()方法時,如果匹配有該UIAbility實例的Key,則直接使用存在的UIAbility實例,否則創建一個新的UIAbility實例代碼演示{"module":{"abilities":[{"launchType":"singleton",//...}]}}代碼實現{"module":{"abilities":[{"launchType":"multiton",//...}]}}代碼實現{"module":{"abilities":[{"launchType":"specified",//...}]}}案例分析啟動模式應用主頁只有一個,采用singleton啟動模式。普通頁面,每次打開都創建一個新的實例,采用multiton啟動模式。每次新建文檔時,希望都能新建一個文檔實例,重復打開一個已保存的文檔時,希望打開的都是同一個文檔實例,此時,采用specified啟動模式較適合。配置啟動模式主頁面啟動模式:singleton文檔頁面啟動模式:specified{"module":{"abilities":[{"name":"HomeAbility","launchType":"singleton",},{"name":"NormalAbility","launchType":"multiton",},{"name":"DocumentAbility","launchType":"specified",}]}}普通頁面啟動模式:multiton配置StageHAP在首次加載時會創建一個MyAbilityStage實例{"module":{"name":"entry","type":"entry","srcEntry":"./ets/myabilitystage/MyAbilityStage.ts",...}}代碼演示Button("新建一個文檔").onClick(()=>{letwant2={deviceId:'',//deviceId為空表示本設備bundleName:'com.example.unit6_launchmodedemo',abilityName:'DocumentAbility',}letcontext=getContext(this)asany;//獲取當前component關聯的contextcontext.startAbility(want2);})代碼演示Button("打開已保存文檔").onClick(()=>{

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

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

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

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

})代碼演示onDestroy(){

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

bundleName:'',abilityName:'UIAbilityB',

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

this.context.startAbility(wantInfo)exportdefaultclassUIAbilityB

extendsUIAbility{onCreate(want,launchParam){

letinfo=want?.parameters?.name;

}UIAbilityBVSUIAbilityA啟動UIAbility并獲取返回結果letwantInfo={

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

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

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

parameters:{

payResult:'OKay',},},}this.context.terminateSelfWithResult(abilityResult,(err)=>{//...});UIAbilityBVSUIAbilityA啟動UIAbility的指定頁面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)=>{});}案例分析啟動UIAbility的指定頁面在EntryAbility中判斷用戶是否是第一次進入app如果是第一次進入,則跳轉到引導頁面如果不是第一次進入,則跳轉到主頁面MainAbilityVSEntryAbility啟動UIAbility的指定頁面

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:{//自定義參數傳遞頁面信息router:'guide',}}//context為調用方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';}}}案例分析啟動UIAbility并獲取返回結果點擊“登錄”圖標,跳轉到登錄頁面登錄頁面,進行登錄驗證登錄成功后返回主頁,同時返回輸入正確的用戶名LoginAbilityVSMainAbility啟動UIAbility并獲取返回結果this.context.startAbilityForResult(wantInfo).then((data)=>{if(data?.resultCode===RESULT_CODE){this.message=data.want?.parameters?.userName.toString();}}).catch((err)=>{//...})Button('登錄').onClick((event:ClickEvent)=>{if(this.username==&&this.password=="123456"){constRESULT_CODE:number=1001;letabilityResult={resultCode:RESULT_CODE,want:{bundleName:'',abilityName:'',

parameters:{userName:this.username,},},}this.context.terminateSelfWithResult(abilityResult)代碼演示this.context.startAbilityForResult(wantInfo).then((data)=>{if(data?.resultCode===RESULT_CODE){//解析被調用方UIAbility返回的信息this.message=data.want?.parameters?.userName.toString();}}).catch((err)=>{//...})

代碼演示Button('登錄').onClick((event:ClickEvent)=>{if(this.username==&&this.password=="123456"){constRESULT_CODE:number=1001;letabilityResult={resultCode:RESULT_CODE,want:{bundleName:'',abilityName:'',parameters:{userName:this.username,},},}this.context.terminateSelfWithResult(abilityResult);}})《鴻蒙HarmonyOS應用開發基礎教程》課程組服務卡片《鴻蒙HarmonyOS應用開發基礎教程》課程組服務卡片知識目錄123服務卡片創建服務卡片配置服務卡片概述4服務卡片事件服務卡片概述01延遲符號服務卡片概述服務卡片服務卡片創建02延遲符號卡片創建方式1卡片創建方式1卡片創建方式1卡片創建方式2卡片創建方式2問題思考服務卡片是元服務嗎?服務卡片配置03延遲符號module.json5配置form_config.json配置服務卡片事件04延遲符號服務卡片事件接口定義:postCardAction(component:Object,action:Object):voidaction參數說明代碼示例總結服務卡片概念

–應用場景是什么?服務卡片創建-創建方式有幾種?服務卡片配置-配置文件有哪些?服務卡片事件-開發流程。認真學鴻蒙一起干大事《鴻蒙HarmonyOS應用開發基礎教程》課程組單元7補充新知識目錄123網絡請求撥打電話手勢SwipeGesture手勢SwipeGesture01延遲符號SwipeGesture接口fingersspeeddirection接口參數SwipeGesture接口:SwipeGesture(value?:{fingers?:number;direction?:SwipeDirection;speed?:number})SwipeDirection參數direction?:SwipeDirection描述滑動手勢的方向SwipeGesture事件Text('Gesture’).gesture(SwipeGesture().onAction((event:GestureEvent)=>{}))網絡請求02延遲符號HTTP數據請求//引入包名importhttpfrom'@.http';//每一個httpRequest對應一個HTTP請求任務,不可復用lethttpRequest=http.createHttp();httpRequest.request(//填寫HTTP請求的URL地址,可以帶參數也可以不帶參數。URL地址需要開發者自定義。請求的參數可以在extraData中指定"EXAMPLE_URL",{method:http.RequestMethod.POST,//可選,默認為http.RequestMethod.GET//當使用POST請求時此字段用于傳遞內容extraData:{"data":"datatosend",},},(err,data)=>{if(!err){//data.result為HTTP響應內容,可根據業務需要進行解析('Result:'+JSON.stringify(data.result));}else{('error:'+JSON.stringify(err));//當該請求使用完畢時,調用destroy方法主動銷毀httpRequest.destroy();}});Axios第三方庫方式2&方式1在Terminal窗口中,執行如下命令安裝三方包,DevEcoStudio會自動在工程的oh-package.json5中自動添加三方包依賴。ohpminstall@ohos/axios在工

溫馨提示

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

評論

0/150

提交評論