嵌入式系统开发 -基于分布式系统OpenHarmony 课件 06-用户程序框架_第1页
嵌入式系统开发 -基于分布式系统OpenHarmony 课件 06-用户程序框架_第2页
嵌入式系统开发 -基于分布式系统OpenHarmony 课件 06-用户程序框架_第3页
嵌入式系统开发 -基于分布式系统OpenHarmony 课件 06-用户程序框架_第4页
嵌入式系统开发 -基于分布式系统OpenHarmony 课件 06-用户程序框架_第5页
已阅读5页,还剩100页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于OpenHarmony的嵌入式开发

第六章用户程序框架大连理工大学-朱明安全边距6.1Ability的模型[6.1.0]Ability的模型

Ability:APP应用程序所具备能力的抽象,也是应用程序的重要组成部分。Ability是系统调度应用的最小单元,是能够完成一个独立功能的组件。在OpenHarmony中,一个应用可以包含一个或多个Ability。

Ability的两种模型:FA模型、Stage模型

FA模型:API8及其早期版本应用程序只能使用FA模型进行开发。基于OpenHarmony的嵌入式开发2FA模型一级分类FA模型二级分类FA(FeatureAbility)PageAbility(页面展示):具备ArkUI(方舟开发框架)实现的Ability,是用户具体可见并可以交互的Ability实例PA(ParticleAbility)ServiceAbility(服务):没有UI,提供其他Ability调用自定义的服务,在后台运行;DataAbility(数据分享):没有UI的Ability,提供其他Ability进行数据的增删查服务,在后台运行;FormAbility(卡片):卡片式Ability,一种界面展示形式。安全边距6.1Ability的模型[6.1.0]Ability的模型

Stage模型:API9开始,Ability框架引入了Stage模型。分为UIAbility(页面展示)和ExtensionAbility(服务扩展)两大类。ExtensionAbility可以分为ServiceExtensionAbility、FormExtensionAbility和DataShareExtensionAbility等。Stage模型具备以下特性:(1)实现应用的能力与系统总体功能和功耗的平衡。在系统运行过程中,前台应用的资源占用会被优先保障,与此同时由于应用能力不同而产生的功耗,也需要符合系统整体功耗的要求。Stage模型通过Ability与UI分离、严格的后台管控、基于场景的服务机制及单进程模型来达成这种应用能力与整体系统功耗的平衡。基于OpenHarmony的嵌入式开发3安全边距6.1Ability的模型[6.1.0]Ability的模型(2)原生支持组件级的迁移和协同。OpenHarmony是原生支持分布式的操作系统,应用框架需要从架构设计上使得组件更易于实现迁移和协同。Stage模型通过Ability与UI分离及UI展示与服务能力合一等模型特性,实现这一设计目标。(3)支持多设备和多窗口形态。为了支持多种设备形态和更易于实现多种不同的窗口形态,需要组件管理服务和窗口管理服务在架构层面上是解耦的,从而方便裁剪,更有利于定制不同的窗口形态。Stage模型通过重新定义了Ability生命周期定义和设计组件管理服务和窗口管理服务的单项依赖解决这一问题。基于OpenHarmony的嵌入式开发4安全边距6.1Ability的模型[6.1.0]Ability的模型

Stage模型三个特性之间的关系基于OpenHarmony的嵌入式开发5应用的能力与系统总体功能和功耗的平衡Ability与UI分离

原生支持组件级的迁移和协同支持多设备和多窗口形态严格的后台管控基于场景的服务单进程模型UI展示与服务功能合一的Ability组件Ability生命周期定义组件管理和窗口管理解耦安全边距6.1Ability的模型[6.1.0]Ability的模型

FA与Stage模型对比:差异概览基于OpenHarmony的嵌入式开发6对比FA模型Stage模型开发方式提供类Web的APIUI开发与Stage模型一致提供面向对象的开发方式UI开发与FA模型一致引擎实例每个进程内的每个Ability实例独享一个JSVM引擎实例每个进程内的多个Ability实例共享一个JSVM引擎实例进程内对象共享不支持支持包描述文件使用config.json描述HAP包和组件信息组件必须使用固定的文件名使用module.json5描述HAP包和组件信息可以指定入口文件名组件提供PageAbility、ServiceAbility、DataAbility以及FormAbility提供UIAbility、ExtensionAbility…………安全边距6.1Ability的模型[6.1.0]Ability的模型

FA与Stage模型对比:IDE差异基于OpenHarmony的嵌入式开发7选择Stage模型进行开发时,语言只能使用ArkTSFA模型则可以支持ArkTS和传统的JS

FA模型安全边距6.1Ability的模型[6.1.0]Ability的模型

FA与Stage模型对比:Ability类型差异(组件)基于OpenHarmony的嵌入式开发8FAPageAbilityServiceAbilityPADataAbilityFormAbilityStage模型AbilityUIAbilityExtensionAbility

ServiceExtensionAbilityDataShareExtensionAbilityFormExtensionAbility……安全边距6.1Ability的模型[6.1.0]Ability的模型

FA与Stage模型对比:基本的生命周期差异基于OpenHarmony的嵌入式开发9INITIALonCreateonActiveonInactiveonHideonDestroyonShowINITIALonCreateonWindowsStageCreateonForegroundonBackgroundonWindowsStageDestroyonDestroy安全边距6.1Ability的模型[6.1.1]FA模型生命周期问题(相对复杂的PageAbility为例)基于OpenHarmony的嵌入式开发10INITIALonCreateonActiveonInactiveonHideonDestroyonShow切换至后台切换至前台函数函数功能onShow()Ability由后台不可见状态切换到前台可见状态调用onShow方法,此时用户在屏幕可以看到该AbilityonHide()Ability由前台切换到后台不可见状态时调用onHide方法,此时用户在屏幕看不到该Ability。onDestroy()应用退出,销毁Ability对象前调用onDestroy方法,开发者可以在该方法里做一些回收资源、清空缓存等应用退出前的准备工作。onCreate()Ability第一次启动创建Ability时调用onCreate方法,开发者可以在该方法里做一些应用初始化工作。Ability失去焦点Ability切换前台获得焦点安全边距6.1Ability的模型[6.1.1]FA模型进程/线程问题:APP独享独立进程,Ability独享独立线程。APP会为每个Ability创建相应的线程,并绑定独立的JSRuntime实例。

基于OpenHarmony的嵌入式开发11进程1APP1线程1线程2Ability1JSRuntime1Ability2JSRuntime2进程2APP2线程1线程2Ability1JSRuntime1Ability2JSRuntime2Ability之间是隔离的安全边距6.1Ability的模型[6.1.2]FAAbility开发

PageAbility的生命周期基于OpenHarmony的嵌入式开发12UNINITIALIZEDINITIALBACKGROUNDINACTIVEACTIVEInitStartActiveStopBackgroundForeground生命周期说明UNINITIALIZED

未初始状态,是一种临时状态。PageAbility被创建后会由该状态进入INITIAL状态。INITIAL

初始化状态,也表示停止状态。表示当前PageAbility未运行,PageAbility被启动后由INITIAL态进入INACTIVE状态INACTIVE

失去焦点状态。表示当前窗口已显示但是无焦点状态。ACTIVE

前台激活状态。表示当前窗口已显示,并获取焦点BACKGROUND

后台状态。表示当前PageAbility退到后台,PageAbility在被销毁后由BACKGROUND状态进入INITIAL状态,或者重新被激活后由BACKGROUND状态进入ACTIVE状态。安全边距6.1Ability的模型[6.1.2]FAAbility开发

PageAbility的启动模式:被启动时的行为基于OpenHarmony的嵌入式开发13启动模式说明singleton单实例模式每次调用startAbility方法时,如果应用进程中该类型的Ability实例已经存在,则复用已有的实例,系统中只存在唯一一个实例。表现为在最近任务列表中只有一个Ability实例。

典型场景:当用户打开视频播放应用并观看视频,回到桌面后,再次打开视频播放应用,应用仍为回到桌面之前正在观看的视频。单实例非首次启动时不会再触发onCreate()接口,而是触发onNewWant(),开发者可以在该方法中获取want,进而根据want做进一步处理。例如,单实例PageAbility迁移场景,指定页面拉起PageAbility场景。standard多实例模式默认启动模式。每次调用startAbility方法时,都会在应用进程中创建一个新的Ability实例。表现为在最近任务列表中可以看到有多个该类型的Ability实例。

典型场景:当用户打开文档应用,选择新建文档的时候,每次点击新建文档,都会创建一个新的文档任务,在最近任务列表中可以看到多个新建的文档任务。安全边距6.1Ability的模型[6.1.2]FAAbility开发

PageAbility的创建:需要重写app.js/app.ets中的生命周期回调函数,开发者通过DevEcoStudio创建PageAbility时,DevEcoStudio会默认生成onCreate()和onDestroy()方法,其他方法需要开发者自行实现。基于OpenHarmony的嵌入式开发14exportdefault{

onCreate(){

(‘ApplicationonCreate‘)

},

onDestroy(){

(‘ApplicationonDestroy‘)

},

onShow(){

(‘ApplicationonShow‘)

},

onHide(){(‘ApplicationonHide‘)

},

onActive(){(‘ApplicationonActive‘)

},

onInactive(){(‘ApplicationonInactive‘)

},

onNewWant(){('ApplicationonNewWant‘)

}}安全边距6.1Ability的模型[6.1.2]FAAbility开发

PageAbility的创建:config.json文件配置abilities:EntryAbility基于OpenHarmony的嵌入式开发15{"abilities":[{"skills":[{"entities":["entity.system.home"],"actions":["action.system.home"]}],

"orientation":"unspecified",

"visible":true,

"srcPath":"EntryAbility","name":".EntryAbility","srcLanguage":"ets","icon":"$media:icon","description":"$string:EntryAbility_desc","formsEnabled":false,"label":"$string:EntryAbility_label","type":"page","launchType":"singleton"}]}安全边距6.1Ability的模型[6.1.2]FAAbility开发启动本地的PageAbility导入FA模块与示例基于OpenHarmony的嵌入式开发16importfeatureAbilityfrom'@ohos.ability.featureAbility'importfeatureAbilityfrom'@ohos.ability.featureAbility'featureAbility.startAbility({want:{bundleName:"com.example.startability",uri:"",parameters:{abilityName:"com.example.startability.MainAbility"}},},);安全边距6.1Ability的模型[6.1.2]FAAbility开发启动远程的PageAbility

featureAbility中的startAbility接口实现了UIAbility的启动功能,需要引入featureAbility:

还需要DeviceManager的getTrustedDeviceListSync接口的支持:基于OpenHarmony的嵌入式开发17importfeatureAbilityfrom'@ohos.ability.featureAbility'importdeviceManagerfrom'@ohos.distributedHardware.deviceManager';

当前DeviceManager的getTrustedDeviceListSync接口仅对系统应用开放。现阶段非系统应用无法获取其他设备信息,无远程启动设备选择入口。featureAbility接口接口说明startAbility(parameter:StartAbilityParameter)启动AbilitystartAbilityForResult(parameter:StartAbilityParameter)启动Ability,并在该Ability被销毁时返回执行结果安全边距6.1Ability的模型[6.1.2]FAAbility开发启动远程的PageAbility还需要DeviceManager的getTrustedDeviceListSync接口的支持:跨设备场景下,启动远程PageAbility首先需要向用户申请数据同步的权限,相关接口如下:基于OpenHarmony的嵌入式开发18importdeviceManagerfrom'@ohos.distributedHardware.deviceManager';

DeviceManager接口接口说明getTrustedDeviceListSync():Array<DeviceInfo>同步获取所有可信设备列表接口接口说明checkAccessToken(tokenID:number,permissionName:Permissions):Promise<GrantStatus>AtManager接口。使用Promise异步回调。校验应用是否授予权限,返回值GrantStatusrequestPermissionsFromUser(context:Context,permissionList:Array<Permissions>,requestCallback:AsyncCallback<PermissionRequestResult>):void;context接口。用于UIAbility拉起弹框请求用户授权。使用callback异步回调安全边距6.1Ability的模型[6.1.3]FA-ServiceAbility开发

Service模板的Ability主要用于后台运行任务(如播放音乐或下载文件),不提供用户交互界面。Service可由其他应用或Ability启动,即使用户切换到其他应用,Service仍将在后台继续运行。基于OpenHarmony的嵌入式开发19生命周期相关接口接口说明onStart():void该方法在创建Service的时候调用,用于Service的初始化。在Service的整个生命周期只会调用一次,调用时传入的Want应为空。onCommand(want:Want,startId:number):void在Service创建完成之后调用,该方法在客户端每次启动该Service时都会调用,开发者可以在该方法中做一些调用统计、初始化类的操作。onConnect(want:Want):rpc.RemoteObject在Ability和Service连接时调用。onDisconnect(want:Want):void在Ability与绑定的Service断开连接时调用。onStop():void在Service销毁时调用。Service应通过实现此方法来清理任何资源,如关闭线程、注册的侦听器等。安全边距6.1Ability的模型[6.1.3]FA-ServiceAbility开发创建ServiceAbility:重写生命周期方法基于OpenHarmony的嵌入式开发20exportdefault{

onStart(){('ServiceAbilityonStart')},

onStop(){('ServiceAbilityonStop')},

onCommand(want,startId){('ServiceAbilityonCommand')},

onConnect(want){('ServiceAbilityonConnect'+want)returnnewFirstServiceAbilityStub('test')},

onDisconnect(want){('ServiceAbilityonDisconnect'+want)}安全边距6.1Ability的模型[6.1.3]FA-ServiceAbility开发注册ServiceAbility:在应用配置文件config.json中进行注册,注册类型type为service。“visible”属性表示ServiceAbility是否可以被其他应用调用,true表示可以,false表示不能。若ServiceAbility需要被其他应用调用,除“visible”为true之外,还需要设置支持关联启动。基于OpenHarmony的嵌入式开发21{"module":{"abilities":[{"name":".ServiceAbility","type":"service","visible":true...}]...}...}安全边距6.1Ability的模型[6.1.3]FA-ServiceAbility开发

ServiceAbility的启动与停止:ServiceAbility的启动与其他Ability相同,可以在PageAbility中通过featureAbility的startAbility()接口拉起ServiceAbility,或在ServiceAbility中通过particleAbility的startAbility接口拉起ServiceAbility。可以在Service中通过terminateSelf()停止。基于OpenHarmony的嵌入式开发22importfeatureAbilityfrom'@ohos.ability.featureAbility';letpromise=featureAbility.startAbility({want:{

bundleName:"com.jstest.service",

abilityName:"com.jstest.service.ServiceAbility",},});启动本地Service

包名称待启动的Ability名称若被调用Service尚未运行,则系统会先调用onStart()来初始化Service,再回调Service的onCommand()方法来启动Service。若已经在运行,则系统会直接回调Service的onCommand()方法来启动Service。安全边距6.1Ability的模型[6.1.3]FA-ServiceAbility开发-

与本地连接的客户端连接本地Service:Service支持其他的Ability通过connectAbility()方法与其进行通信。需要传入的参数有目标Service的Want和IAbilityConnection的实例。

IAbilityConnection提供了:①onConnect()是用来处理连接Service成功的回调;②onDisconnect()是用来处理Service异常死亡的回调;③onFailed()是用来处理连接Service失败的回调。基于OpenHarmony的嵌入式开发23functiononConnectCallback(element,remote){console.log('onConnectLocalServiceonConnectDoneelement:'+element);console.log('onConnectLocalServiceonConnectDoneremote:'+remote);

……}functiononDisconnectCallback(element){console.log('ConnectAbilityonDisconnectCallback')}functiononFailedCallback(code){console.log('ConnectAbilityonFailedCallback')}安全边距6.1Ability的模型[6.1.3]FA-ServiceAbility开发-

与本地连接的客户端连接本地Service:示例源码基于OpenHarmony的嵌入式开发24importfeatureAbilityfrom'@ohos.ability.featureAbility';letconnId=featureAbility.connectAbility({

bundleName:"com.jstest.service",

abilityName:"com.jstest.service.ServiceAbility",},{

onConnect:onConnectCallback,

onDisconnect:onDisconnectCallback,

onFailed:onFailedCallback,},);安全边距6.1Ability的模型[6.1.3]FA-ServiceAbility开发-

与本地连接的服务端连接本地Service:定义Server的通信接口基于OpenHarmony的嵌入式开发25importrpcfrom"@ohos.rpc";letmMyStub;exportdefault{onStart(){classMyStubextendsrpc.RemoteObject{constructor(des){if(typeofdes===‘string’){

super(des);

}returnnull;}onRemoteRequest(code,data,reply,option){console.log("ServiceAbilityonRemoteRequestcalled");if(code===1){letop1=data.readInt();letop2=data.readInt();console.log("op1="+op1+",op2="+op2);reply.writeInt(op1+op2);}else{

console.log(“ServiceAbilityunknownrequestcode”);

}returntrue;}}mMyStub=newMyStub("ServiceAbility-test");},onCommand(want,startId){console.log('ServiceAbilityonCommand');},onConnect(want){console.log('ServiceAbilityOnConnect');returnmMyStub;},onDisconnect(want){console.log('ServiceAbilityOnDisConnect');},onStop(){console.log('ServiceAbilityonStop');},}onConnect()需要返回一个IRemoteObject对象。OpenHarmony提供了IRemoteObject的默认实现,开发者可以通过继承rpc.RemoteObject来创建自定义的实现类。安全边距6.1Ability的模型[6.1.3]FA-ServiceAbility开发-

与远程连接的客户端连接远程Service:针对系统应用,需要getTrustedDeviceListSync接口和DeviceManager接口的支持。若Service需要与PageAbility或其他应用的ServiceAbility进行跨设备交互,需要创建用于连接的Connection。Service支持其他Ability通过connectAbility()方法与其进行跨设备连接。

在使用connectAbility()处理回调时,需要传入目标Service的Want与IAbilityConnection的实例。

IAbilityConnection提供了:①onConnect()是用来处理连接Service成功的回调;②onDisconnect()是用来处理Service异常死亡的回调;③onFailed()是用来处理连接Service失败的回调。基于OpenHarmony的嵌入式开发26与本地连接一致的安全边距6.1Ability的模型[6.1.3]FA-ServiceAbility开发-

与远程连接的客户端

IAbilityConnection提供了:①onConnect()是用来处理连接Service成功的回调;②onDisconnect()是用来处理Service异常死亡的回调;③onFailed()是用来处理连接Service失败的回调。基于OpenHarmony的嵌入式开发27functiononConnectCallback(element,remote){console.log('onConnectRemoteServiceonConnectDoneelement:'+element);console.log('onConnectRemoteServiceonConnectDoneremote:'+remote);mRemote=remote;if(mRemote==null){prompt.showToast({message:"onConnectRemoteServicenotconnectedyet"});return;}……}functiononDisconnectCallback(element){console.log('ConnectRemoteAbilityonDisconnectCallback')}functiononFailedCallback(code){console.log('ConnectRemoteAbilityonFailedCallback')}安全边距6.1Ability的模型[6.1.3]FA-ServiceAbility开发-

与远程连接的客户端

目标Service的want中需要包含远程deviceId,该远程deviceId可通过deviceManager获取:基于OpenHarmony的嵌入式开发28importdeviceManagerfrom'@ohos.distributedHardware.deviceManager';letdmClass;functiongetRemoteDeviceId(){if(typeofdmClass==='object'&&dmClass!=null){letlist=dmClass.getTrustedDeviceListSync();if(typeof(list)=='undefined'||typeof(list.length)=='undefined'){console.log("MainAbilityonButtonClickgetRemoteDeviceIderr:listisnull");return;}console.log("MainAbilityonButtonClickgetRemoteDeviceIdsuccess:"+list[0].deviceId);

returnlist[0].deviceId;}else{console.log("MainAbilityonButtonClickgetRemoteDeviceIderr:dmClassisnull");}}安全边距6.1Ability的模型[6.1.3]FA-ServiceAbility开发-

与远程连接的客户端

连接远程Service:示例源码基于OpenHarmony的嵌入式开发29importfeatureAbilityfrom'@ohos.ability.featureAbility';letconnId=featureAbility.connectAbility({

deviceId:getRemoteDeviceId(),

bundleName:"ohos.samples.etsDemo",

abilityName:"ohos.samples.etsDemo.ServiceAbility",},{

onConnect:onConnectCallback,

onDisconnect:onDisconnectCallback,

onFailed:onFailedCallback,},);与本地连接不同之处跨设备场景下,还需要向用户申请数据同步的权限,方法见教材

安全边距6.1Ability的模型[6.1.3]FA-ServiceAbility开发-

与远程连接的服务端

Service端:在onConnect()时返回IRemoteObject,定义与Service进行通信的接口基于OpenHarmony的嵌入式开发30importrpcfrom"@ohos.rpc";classFirstServiceAbilityStubextendsrpc.RemoteObject{constructor(des){if(typeofdes==='string'){super(des);}else{returnnull;}}onRemoteRequest(code,data,reply,option){console.log("ServiceAbilityonRemoteRequestcalled");if(code===1){letop1=data.readInt();letop2=data.readInt();console.log("op1="+op1+",op2="+op2);reply.writeInt(op1+op2);}else{

console.log("ServiceAbilityunknownrequestcode");}returntrue;}}exportdefault{onStart(){('ServiceAbilityonStart');},onStop(){('ServiceAbilityonStop');},onConnect(want){console.log("ServiceAbilityonConnect");try{letvalue=JSON.stringify(want);console.log("ServiceAbilitywant:"+value);}catch(error){console.log("ServiceAbilityerror:"+error);}

returnnewFirstServiceAbilityStub("firsttsservicestub");},

onDisconnect(want){

……},onCommand(want,startId){

……

}};安全边距6.1Ability的模型[6.1.4]FA-DataAbility开发

-

部分接口

基于Data模板的Ability,能够管理其应用自身和其他应用存储数据的访问,并提供与其他应用共享数据的方法。

Data既可用于同设备不同应用的数据共享,也支持跨设备不同应用的数据共享。

Data提供方可以自定义数据的增、删、改、查,以及文件打开等功能,并对外提供这些接口。基于OpenHarmony的嵌入式开发31部分生命周期相关接口接口说明onInitialized(info:AbilityInfo):void在Ability初始化调用,通过此回调方法执行RDB等初始化操作update(uri:string,valueBucket:rdb.ValuesBucket,predicates:dataAbility.DataAbilityPredicates,callback:AsyncCallback<number>):void更新数据库中的数据query(uri:string,columns:Array<string>,predicates:dataAbility.DataAbilityPredicates,callback:AsyncCallback<ResultSet>):void查询数据库中的数据安全边距6.1Ability的模型[6.1.4]FA-DataAbility开发

-

Data开发

需要实现Data中Insert、Query、Update、Delete接口的业务内容,保证能够满足数据库存储业务的基本需求。基于OpenHarmony的嵌入式开发32onInitialized(abilityInfo){('DataAbilityonInitialized,abilityInfo:'+abilityInfo.bundleName)

……},

insert(uri,valueBucket,callback){('DataAbilityinsertstart')rdbStore.insert(TABLE_NAME,valueBucket,callback)},query(uri,columns,predicates,callback){('DataAbilityquerystart')letrdbPredicates=dataAbility.createRdbPredicates(TABLE_NAME,predicates)rdbStore.query(rdbPredicates,columns,callback)},

update(uri,valueBucket,predicates,callback){('DataAbilityupdatestart')letrdbPredicates=dataAbility.createRdbPredicates(TABLE_NAME,predicates)rdbStore.update(valueBucket,rdbPredicates,callback)},

delete(uri,predicates,callback){('DataAbilitydeletestart')letrdbPredicates=dataAbility.createRdbPredicates(TABLE_NAME,predicates)rdbStore.delete(rdbPredicates,callback)}"abilities":[{"srcPath":"DataAbility","name":".DataAbility","icon":"$media:icon","srcLanguage":"ets","description":"$string:description_dataability","type":"data","visible":true,“uri”:

"dataability://ohos.samples.etsdataability.DataAbility"}]实现config.json配置文件name:Ability的名称,对应Ability派生的Data类名;type:Ability的类型,Data对应的Ability类型为data;uri:通信使用的URI;visible:对其他应用是否可见,设置为true时,Data才能与其他应用进行通信传输数据。安全边距6.1Ability的模型[6.1.4]FA-DataAbility开发

-

Data开发

实现工具类的接口对象DataAbilityHelper并构建数据库相关RDB数据

①创建工具接口对象②构建数据库相关的RDB数据基于OpenHarmony的嵌入式开发33importfeatureAbilityfrom'@ohos.ability.featureAbility'importohos_data_abilityfrom'@ohos.data.dataAbility'importohos_data_rdbfrom'@ohos.data.rdb'varurivar="dataability:///com.ix.DataAbility"varDAHelper=featureAbility.acquireDataAbilityHelper(

urivar);varvaluesBucket={"name":"oureda"}varda=newohos_data_ability.DataAbilityPredicates()varvalArray=newArray("value1");varcars=newArray({"batchInsert1":"value1",});安全边距6.1Ability的模型[6.1.4]FA-DataAbility开发

-

Data开发

实现工具类的接口对象DataAbilityHelper并构建数据库相关RDB数据

③调用insert方法向指定的Data子模块插入数据。

④类似,调用delete、update、query方法的处理过程不再列出。基于OpenHarmony的嵌入式开发34//callback方式调用:DAHelper.insert(urivar,valuesBucket,(error,data)=>{console.log("DAHelperinsertresult:"+data)});//promise方式调用:vardatainsert=awaitDAHelper.insert(urivar,valuesBucket);安全边距6.1Ability的模型[6.1.4]FA-DataAbility开发

-

Data开发

实现工具类的接口对象DataAbilityHelper并构建数据库相关RDB数据

⑤调用batchInsert方法向指定的数据子模块批量插入数据⑥调用executeBatch方法向指定的Data子模块进行数据的批量处理,以及其他必要的需要Data子模块进行数据处理的方法,不再列出源码基于OpenHarmony的嵌入式开发35//callback方式调用:DAHelper.batchInsert(urivar,cars,(error,data)=>{console.log("DAHelperbatchInsertresult:"+data)});//promise方式调用:vardatabatchInsert=awaitDAHelper.batchInsert(urivar,cars);安全边距6.1Ability的模型[6.1.5]Stage模型-回顾回顾FA模型与Stage模型的区别基于OpenHarmony的嵌入式开发36对比FA模型Stage模型开发方式提供类Web的APIUI开发与Stage模型一致提供面向对象的开发方式UI开发与FA模型一致引擎实例每个进程内的每个Ability实例独享一个JSVM引擎实例每个进程内的多个Ability实例共享一个JSVM引擎实例进程内对象共享不支持支持包描述文件使用config.json描述HAP包和组件信息组件必须使用固定的文件名使用module.json5描述HAP包和组件信息可以指定入口文件名组件提供PageAbility、ServiceAbility、DataAbility以及FormAbility提供Ability、Extension…………解决FA模型无法解决的开发场景问题,方便开发者更加方便地开发出分布式环境下的复杂应用。安全边距6.1Ability的模型[6.1.5]Stage模型-基本概念

Stage模型的基本概念基于OpenHarmony的嵌入式开发37HarmonyAbilityPackage,OpenHarmony应用编译、分发和加载的基本单位,也称为module,每个HAP都有一个应用内唯一的名称,称为moduleName

通过appid标识的OpenHarmony应用,Bundle可以包含多个HAP,每个应用都有一个bundleName,但是bundleName并不能唯一标识一个应用,appid中包含bundleName以及其他的更多信息,能够唯一标识一个应用对应Bundle的运行期对象,运行期开发者不可见对应HAP的运行期对象,在HAP首次加载到进程中时创建,运行期开发者可见安全边距6.1Ability的模型[6.1.5]Stage模型-基本概念

Stage模型的基本概念基于OpenHarmony的嵌入式开发38Window:窗口管理器管理的基本单元,持有一个ArkUI引擎实例ArkUIPage:方舟开发框架页面Ability:提供生命周期回调,持有AbilityContext,支持组件迁移/协同WindowStage:本地窗口管理器提供运行期开发者可以调用的各种能力,Ability组件和各种ExtensionAbility都有各自不同的context类,他们都继承自基类Context,基类提供包名、moduleName、路径等信息基于场景的服务扩展能力统称,系统定义了多种基于场景的ExtensionAbility类,它们持有各自的ExtensionContext

安全边距6.1Ability的模型[6.1.5]Stage模型-生命周期

Stage模型的生命周期基于OpenHarmony的嵌入式开发39与界面相关内容强相关的获焦、失焦状态放在WindowStage之中,实现Ability与窗口之间的弱耦合Stage模型定义Ability组件的生命周期,只包含创建、销毁和前后台等状态安全边距6.1Ability的模型[6.1.5]Stage模型-

Ability组件实例与任务

Ability组件实例与任务

PageAbility两种启动模式:singleton单实例模式、standard多实例模式

Stage模型中的Ability组件有三种启动类型:singleton单实例模式、standard多实例模式和Specified模式

Singleton模式:应用进程中只存在一个该类型的Ability实例

Standard模式:每次startAbility调用,都会在应用进程中创建一个该类型的实例

Specified模式:允许开发者在系统创建AbilityRecord之前,为该实例创建一个key,后续每次创建该类型的Ability实例都会询问应用使用哪个key对应的Ability实例,来响应startAbility请求基于OpenHarmony的嵌入式开发40安全边距6.1Ability的模型[6.1.5]Stage模型-

Ability组件实例与任务

Ability组件实例与任务基于OpenHarmony的嵌入式开发41Q:Ability1、Ability2和Ability3分别是何种启动模式?每个Ability实例都对应了一个Mission,保存该Ability实例的快照,实例销毁后,Mission中的会保留Ability的类的信息和快照,直到用户删除,或者超过存储上限安全边距6.1Ability的模型[6.1.5]Stage模型-

ExtensionAbility

ExtensionAbility机制:基于特定场景(例如服务卡片、输入法等)提供的应用组件,以便满足更多的使用场景。(1)独立于主进程的单独进程运行,与主进程无IPC,共享一个存储沙箱;(2)独立的Context提供基于业务场景的api能力;(3)由系统触发创建,应用不能直接创建;(4)ExtensionAbility和进程的生命周期受系统管理。每一个具体场景对应一个ExtensionAbilityType,开发者只能使用、实现或访问系统已定义的类型。各类型的ExtensionAbility组件均由相应的系统服务统一管理,例如InputMethodExtensionAbility组件由输入法管理服务统一管理。基于OpenHarmony的嵌入式开发42安全边距6.1Ability的模型[6.1.5]Stage模型-

ExtensionAbility

ExtensionAbility机制:部分系统支持的ExtensionAbility类型基于OpenHarmony的嵌入式开发43ExtensionAbility类型功能说明第三方应用实现第三方应用访问FormExtensionAbilityFORM类型的ExtensionAbility组件,用于提供服务卡片的相关能力。YNWorkSchedulerExtensionAbilityWORK_SCHEDULER类型的ExtensionAbility组件,用于提供延迟任务的相关能力。YNAInputMethodExtensionAbilityINPUT_METHOD类型的ExtensionAbility组件,用于实现输入法应用的开发。YYAccessibilityExtensionAbilityACCESSIBILITY类型的ExtensionAbility组件,用于实现无障碍扩展服务的开发。YNA…………更多类型可参阅官方文档:ExtensionAbility组件概述

安全边距6.1Ability的模型[6.1.5]Stage模型-

ExtensionAbility基于OpenHarmony的嵌入式开发44例:调用方应用发起对InputMethodExtensionAbility组件的调用:先调用输入法管理服务,由输入法管理服务拉起InputMethodExtensionAbility组件,返回给调用方,同时输入法管理服务开始管理其生命周期

ExtensionAbility机制:所有类型的ExtensionAbility组件均不能被应用直接启动,而是由相应的系统管理服务拉起,以确保其生命周期受系统管控,使用时拉起,使用完销毁。

ExtensionAbility组件的调用方无需关心目标ExtensionAbility组件的生命周期。安全边距6.1Ability的模型[6.1.5]Stage模型-

ExtensionAbility

ExtensionAbility机制:实现卡片FormExtensionAbility为例卡片框架提供了FormExtensionAbility基类,开发者通过派生此基类(如MyFormExtensionAbility),实现回调(如创建卡片的onCreate()回调、更新卡片的onUpdateForm()回调等)来实现具体卡片功能卡片FormExtensionAbility实现方不用关心使用方何时去请求添加、删基于OpenHarmony的嵌入式开发45除卡片,FormExtensionAbility实例及其所在的ExtensionAbility进程的整个生命周期,都是由卡片管理系统服务FormManagerService进行调度管理。安全边距6.1Ability的模型[6.1.5]Stage模型-进程模型-

应用

OpenHarmony系统的应用均满足单进程模型。单进程模型指不允许应用配置多进程,应用中所有的进程都是由系统创建和管理的。每个应用至多并存三类进程:(1)主进程:运行所有的Ability组件、页面和业务逻辑。应用中(同一Bundle名称)的所有UIAbility、ServiceExtensionAbility和DataShareExtensionAbility均是运行在主进程这个独立进程中;(2)Extension进程:运行应用中的ExtensionAbility派生类,该进程由系统中的特定场景的服务管理其生命周期。应用中(同一Bundle名称)的所有同一类型ExtensionAbility(除ServiceExtensionAbility和DataShareExtensionAbility外)均是运行这个独立进程中;(3)Render进程:专门为webview创建的进程,webview独有的进程,用于加载webview的渲染库。基于OpenHarmony的嵌入式开发46安全边距6.1Ability的模型[6.1.5]Stage模型-进程模型-应用基于OpenHarmony的嵌入式开发47主进程Extension进程渲染进程安全边距6.1Ability的模型[6.1.5]Stage模型-进程模型-

系统应用系统应用可通过申请多进程权限,为指定HAP配置自定义进程名。HAP中的UIAbility、DataShareExtensionAbility、ServiceExtensionAbility就会运行在自定义进程中。基于OpenHarmony的嵌入式开发48系统中应用间和应用内都会存在多个进程的情况,系统提供了如下两种进程间通信机制:(1)公共事件机制:多用于一对多的通信场景,公共事件发布者可能存在多个订阅者同时接收事件,为应用程序提供订阅、发布、退订公共事件的能力;(2)后台服务机制:通过ServiceExtensionAbility的能力实现。该机制支持系统应用实现一个后台服务并对外提供相应的能力;系统应用A实现了一个后台服务,三方应用B可以通过连接系统应用A的后台服务与其进行进程间通信。安全边距6.1Ability的模型[6.1.6]Ability开发

基于Stage模型的Ability应用开发,主要涉及如下功能逻辑:

(1)创建支持使用屏幕浏览及人机交互的Ability应用,包括实现Ability的生命周期、获取Ability配置信息、向用户申请授权及环境变化通知等场景;(2)启动Ability应用,包括相同设备启动Ability、跨设备启动Ability以及指定页面启动Ability等场景;(3)通用组件Call功能;(4)与ServiceExtensionAbility的连接和断开连接;(5)应用迁移。关于Ability开发:以知识点的方式进行介绍基于OpenHarmony的嵌入式开发49安全边距6.1Ability的模型[6.1.6]Ability开发-

Ability相关接口举例

相关接口主要包括了AbilityStage类和Ability类,其中的AbilityStage类和AbilityContext类是具有context属性的。使用前,应先导入对应的模块

AbilityStage部分接口和功能基于OpenHarmony的嵌入式开发50importAbilityStagefrom'@ohos.application.AbilityStage’;importAbilityfrom'@ohos.application.Ability';相关接口接口说明onCreate():voidAbilityStage初始化时被调用onAcceptWant(want:Want):string启动指定Ability时被调用onConfigurationUpdated(config:Configuration):void全局配置发生变更时被调用安全边距6.1Ability的模型[6.1.6]Ability开发-

Ability相关接口举例

AbilityContext的部分启动接口和功能基于OpenHarmony的嵌入式开发51接口接口说明startAbility(want:Want,callback:AsyncCallback<void>):void启动AbilitystartAbility(want:Want,options?:StartOptions):Promise<void>启动AbilitystartAbilityWithAccount(want:Want,accountId:number,callback:AsyncCallback<void>):void带AccountId启动AbilitystartAbilityWithAccount(want:Want,accountId:number,options?:StartOptions):Promise<void>带AccountId启动AbilitystartAbilityForResult

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论