
OpenHarmony ServiceAbility(二)远程服务 原创 精华
目的
实现启动远程服务和关闭远程服务,通过connectAbility可以连接远程的服务,通过客户端将请求发送到远程服务,远程服务进行业务处理并把结果返回到请求端,实现连接远程服务的能力。
前置条件
环境
设备:DAYU200 开发板
系统:OpenHarmony 3.1 release
IDE:DevEco Studio 3.0 Beta3
项目实践
以下内容属于个人实践总结,在不同的系统版本、不同的SDK版本存在着一些差异,如果有描述错误的地方请留意修改,谢谢。
创建一个项目
创建项目
坑点1、建议使用eTS语言开发服务模块
理由:根据实践发现,通过JS开发的Service只能开启本地服务,无法连接远程服务,问题已在社区反馈,如果你需要使用JS开发服务,并且还需要实现连接远程服务,请关注社区的解决进度:OpenHarmony3.1release 连接服务失败
创建service
这里重复的说明下服务的生命周期功能介绍
接口名 | 描述 |
---|---|
onStart | 该方法在创建Service的时候调用,用于Service的初始化。在Service的整个生命周期只会调用一次,调用时传入的Want应为空。 |
onCommand | 在Service创建完成之后调用,该方法在客户端每次启动该Service时都会调用,开发者可以在该方法中做一些调用统计、初始化类的操作。 |
onConnect | 在Ability和Service连接时调用。 |
onDisconnect | 在Ability与绑定的Service断开连接时调用。 |
onStop | 在Service销毁时调用。Service应通过实现此方法来清理任何资源,如关闭线程、注册的侦听器等。 |
从这里可以看出,IDE为我们自动创建的service生命周期函数中,还有两个重要的函数onConnect(want)、onDisconnect(want) 没有实现,你可以通过手动方式添加函数。这里顺便提一下,如果是使用 startAbility()的方式启动本地服务,则可以不实现onConnect(want)函数。
注册服务
Service也需要在应用配置文件config.json中进行注册,注册类型type需要设置为service。
注意:注册服务时需要将 “visible”: true
声明权限
因为本案例中需要使用到分布式相关的内容,所以在config.json配置文件中的module模块下添加DISTRIBUTED_DATASYNC 权限声明。
服务开发
Service与Page Ability或其他应用的Service Ability进行跨设备交互,则须创建用于连接的Connection。Service支持其他Ability通过connectAbility()方法与其进行跨设备连接。
在使用connectAbility()处理回调时,需要传入目标Service的Want与IAbilityConnection的实例。IAbilityConnection提供了以下方法供开发者实现:onConnect()是用来处理连接Service成功的回调,onDisconnect()是用来处理Service异常死亡的回调,onFailed()是用来处理连接Service失败的回调。
连接远程服务 connectService()
连接远程服务流程图
连接远程服务的业务流程
1、启动应用,自动开启局域网内的设备扫描;
2、未认证的设备,显示在设备列表中,从设备列表中选择需要连接的远程设备,点击"连接";
3、系统发起PIN码认证,根据提示输入PIN码认证成功;
4、在已认证设备列表中点击"操作"进入操作页面,选择服务模块进行操作;
5、为了方便查看本次操作是通过远端服务进行处理,可以点击"启动服务APP",远程调度服务FA,用于展示客户端的请求和服务端处理的结果;
6、使用远程服务能力之前,必须要先创建连接,可以点击:“连接服务”,如果连接成功则提示:“服务连接成功”;
7、输入需要排序的字符串;
8、点击"排序",此时如果远程服务的FA被启动,则在远程服务的FA上显示客户端请求的排序字符串;
9、服务端收到排序请求后进行排序处理,最终将结果返回给客户端显示,同时在服务端的FA上也显示计算的结果。
关键的代码
本案例中,由于客户端代码使用JS,服务端代码使用eTS,为什么服务端代码需要使用eTS开发呢?前面我们提过,因为JS开发的服务,无法连接JS开发的客户端,所以服务端的代码这里采用rTS。
(客户端)分布式设备连接处理器–RemoteDeviceModel.js
说明:RemoteDeviceModel主要负责扫描局域网内的设备、获取已认证的设备、具体设备的状态变化。
(客户端)远程服务连接–ServiceModel.js
说明:ServiceModel 主要实现远程服务的连接、提供远程服务代理对象、断开远程服务能力。
(服务端)服务–ServiceAbility
service.ts:此服务的目的是接收到客户端的请求,根据请求码进行相关的业务操作,本案例中主要完成字符串的排序功能,为了更方便查看客户端的请求数据,服务代理收到数据后,通过公共事件传输给页面显示。
注意:公共事件类似于全局广播,订阅者都能收到公共事件,所以建议非必要情况下业务相关的通知可以不适用公共事件进行通知,如果一定要使用公共事件通知业务,那么注册的事件名称也尽量与业务相关,避免出现错误。
客户端向服务端发送排序请求
至此调用远程服务处理业务的功能就介绍完成,如果有什么疑问可以留言询问。
感谢
如果您能看到最后,还希望您能动动手指点个赞,一个人能走多远关键在于与谁同行,我用跨越山海的一路相伴,希望得到您的点赞。
