当前位置: 首页 > 科技观察

OpenHarmony的eTSFA调用eTSServiceAbility

时间:2023-03-20 16:47:31 科技观察

了解更多开源请访问:开源基础软件社区https://ost.51cto.com1.简介本文是ServiceAbility示例的实践,主要展示eTSFA调用eTSPA实现字符串排序功能,其中PA指的是ServiceAbility。能力是对应用能力的抽象,也是应用的重要组成部分。一个应用可以有多种能力(即可以包含多种能力),HarmonyOS支持以能力为单位部署应用。能力分为FA(FeatureAbility)和PA(ParticleAbility)两种。每种类型都为开发者提供了不同的模板来实现不同的业务功能。Gitee示例地址:https://gitee.com/openharmony/app_samples/tree/master/ability/ServiceAbility。也可以自己下载运行,但需要在OpenHarmony设备上运行。先展示一下效果:2、代码解释└─main│config.json│├─ets│├─MainAbility│││app.ets│││││├─component│││OperateView.ets││TitleBar。ets│││├─model││ServiceModel.ts││││└─pages││Index.ets││└─ServiceAbility│service.ts││││└─pages││Index.ets││└─ServiceAbility│service.ts││││└─resourcesPAbility终端下的serviceAbility。ts服务能力类,我们先看服务端,因为功能是服务端定义的。通过查看,我们可以知道这个服务能力类的核心实现了什么功能,以及如何定义这样一个服务能力类。对比下图,它做了那些事情:引入了rpc依赖,RPC,全称RemoteProcedureCall(远程过程调用),也就是调用远程计算机上的服务,就像调用本地服务一样。类命名建议遵循XxxxStub,在onRemoteRequest函数中继承rpc.RemoteObject类,根据业务定义请求代码,实现响应函数。data是入参,reply是返回结果。记得返回true。在export的回调函数中,onConnect函数应该返回new的当前实例。FA终端1.MainAbility下的ServiceModel.ts服务模块客户端先来看看ServiceModel.ts。注意这里也是一个ts文件,说明也是一个类,主要是调用服务端的服务能力类。看对比图:引入了featureAbility和rpc的依赖。rpc对象mRemote已定义。定义设备ID以支持远程设备。定义了connectService和disconnectService方法,用于连接和断开服务能力。定义rpc对象的get方法,用于调用远程方法。定义了几个事件回调函数,包括:onConnectCallback、onDisconnectCallback、onFailedCallback。我们先来看看这里的connectService函数。//连接服务connectService(){console.log(`${TAG}onCconnectServicebegin`)connection=featureAbility.connectAbility({deviceId:localDeviceId,bundleName:'ohos.samples.etsserviceability',abilityName:'ohos.samples.etsserviceability.比如placeholder和onChange的使用。您可以了解@Link装饰器的使用。Prop、Link、Consume、Objectlink禁止局部初始化。它是直接从父组件传递过来的。(查看更多装饰器)我们再来看看如何在Index.ets页面上使用这个组件。@ComponentexportstructOperateView{@Linkbefore:string@Linkafter:stringbuild(){Column(){TextArea({placeholder:$r('app.string.input_placeholder')}).fontSize(22).width('94%').constraintSize({minHeight:50}).margin({top:10}).onChange((value:string)=>{this.before=value})Text(this.after).fontSize(22).width('94%').margin({top:10}).constraintSize({minHeight:50}).padding(10).border({width:1,color:Color.Gray,radius:20})}}}3.MainAbility下的Index.ets主页Index.ets是本示例项目的主页面,与用户交互的部分显示在该页面上。先看截图:prompt和rpc依赖的介绍。prompt是一个信息提示对话框组件。声明一个serviceModel实例化变量。定义了一个异步排序函数,调用serviceModel提供的字符串排序方法。构建代码块来构建UI组件。我们来看看构建代码块的内容:1.调用OperateView组件,将排序前后的两个字符串传递给组件进行显示。记住OperateView组件的定义。@ComponentexportstructOperateView{@Linkbefore:string@Linkafter:string2.ForEach循环创建按钮组件,包括:连接服务,断开服务,字符串排序,结合switch的使用,避免写很多重复的代码。这个例子进行分析。四、补充说明1、上面为什么把服务端和客户端分开说?因为鸿蒙应用的最小单元是Ability,即可以按照Ability进行拆分,然后进行分布式部署。2.如果要预览包含@Link变量的UI组件怎么办?被@Link修饰的变量禁止局部初始化。不管加@Entry还是@Preview,还是会预览报错。如果一定要预览,把@Link换成其他Type装饰器,记得稍后改回来。了解更多开源知识,请访问:开源基础软件社区https://ost.51cto.com。