版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单元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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026年项目合同管理专项训练题库
- 2025-2026年电子商务师考试电子商务安全与隐私保护模拟试题
- 2025-2026年物业管理从业人员物业管理信息化系统应用与维护模拟试卷
- 化工厂危化品使用制度
- 九年级下册英语外研版同步练习module 1 travel达标测试卷(含答案 )
- 医院针灸推拿科2026年工作总结及下一步计划
- 2026初中物理教资面试教资面试结构化真题题库
- 智能生产线优化分析方案
- T-CPARK 60-2024 防爆抓斗桥式起重机
- T-HBSF 005-2025 薰衣草露地栽培技术规程
- 2026年法考主观题案例分析答题模板
- 测绘工程院测绘外业生产安全工作手册(标准版)
- 小学教师师德师风管理制度
- 市政管道清淤工程方案
- 2026年天津市中考英语试题(含答案)
- 《传感器与检测技术》课件 第四章 电容式传感器
- SHL 德勤在线测评真题
- 2026年高考全国二卷英语考试题目及答案
- 2026年山西省汉字听写大赛试题
- 2025 年大学秘书学(秘书实务)期末测试卷
- 2025-2026学年上海市徐汇区九年级(上)期中语文试卷(含答案)
评论
0/150
提交评论