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

OpenHarmony利用FA调整PA能力实现JS消息订阅功能

时间:2023-03-21 17:31:01 科技观察

了解更多开源请访问:51CTO开源基础软件社区https://ost.51cto.com前言目前JSUI框架提供的事件发布订阅功能只能在API7版本上使用。为了满足开发需求,我们在JAVA端实现消息订阅和分发逻辑,通过JS调用JAVA能力将接口暴露给JS端,实现消息订阅。发布能力。效果展示实现思路1.定义消息数据消息事件包含事件类型,携带数据。我们首先定义一个JavaBean对象来表示消息数据。类事件{私有字符串类型;privateStringdata;}2.定义接口现在消息数据模型已经就位,可以定义接口了。消息订阅接口。key用于表示订阅者对象的标识。callback是消息的回调接口,我们希望订阅者只收到自己关心的事件,所以需要增加一个参数subscribeEventTypes表达关注的事件类型。voidsubscribeEvent(key,subscribeEventTypes,callback)取消订阅接口。有订阅就会有取消,key用来表示订阅对象的唯一标识。voidunSubscribeEvent(key)发布消息的接口。发布消息接口,type表示消息类型,data表示携带的数据。voidpublishEvent(type,data)3.JAVA端逻辑我们使用PA调FA机制,所以需要新建一个JAVA远程服务Ability。目前,有两种类型的服务器和内部。ServiceAbility,这里不用考虑多进程和生命周期的问题,所以这里使用了InternalAbility。(1)首先创建一个类EventInternalAbility,调用setInternalAbilityHandler接口实现JS端请求处理接口,处理三种请求。publicclassEventInternalAbilityextendsAceInternalAbility{privatefinalConcurrentHashMapobservers=newConcurrentHashMap<>(10);privateEventInternalAbility(){setInternalAbilityHandler(this::onRemoteRequest);}privatebooleanonRemoteRequest(intcode,MessageParceldata,MessageParcelreply,MessageOptionoption){switch(code){caseSUBSCRIBE://处理订阅消息请求addObserver();休息;caseUNSUBSCRIBE://处理取消订阅消息请求removeObserver();休息;casePUBLISH_EVENT://处理消息分发publishEvent();休息;}返回真;}}(2)处理订阅消息请求,我们需要在该函数下处理消息订阅的事件类型和订阅对象。公共类EventInternalAbility{privatevoidaddObserver(MessageParceldata){JSONdataJson=newJSON(data.readString());//解析订阅者的标识符Stringkey=dataJson.get("key");//解析订阅者的关系数据ListsubscribeEventTypes=dataJson.get("subscribeEventType");//添加订阅者到地图队列observers.put(key,newEventObserver(subscribeEventTypes,data.readRemoteObject()));}}(3)处理取消订阅消息请求,这个逻辑比较简单,去掉identifier对应的订阅对象即可。observers.remove(key)(4)处理消息分发请求,我们需要在该函数下完成消息数据解析和消息分发处理。publicclassEventInternalAbility{privatevoidpublishEvent(MessageParceldata){//解析数据JSONdataJson=newJSON(data.readString());StirngeventType=dataJson.get("type");StirngeventData=dataJson.get("数据");//分发消息observers.forEach((key,eventObserver)->{if(eventObserver.getSubscribeEventType().contains(eventType)){eventObserver.handlenEvent(eventType,eventData);}});}}(5)至此,我们JAVA端的关键代码已经完成,我们还需要在应用启动入口添加EventInternalAbility服务。publicclassEventInternalAbility{privatestaticfinalEventInternalAbilityINSTANCE=newEventInternalAbility();//添加启动服务分发publicstaticvoidstartServer(){//我们在构造函数下实现了JS端请求处理接口,这里可以为空}}publicclassMyApplicationextendsAbilityPackage{@OverridepublicvoidonInitialize(){super.onInitialize();//在APP入口启动服务EventInternalAbility.startServer();}}4。在JS端逻辑上新建一个event-utils.js脚本文件,实现上面定义的接口。JS端的代码比较简单。主要是将输入的数据透传给JAVA端。逻辑比较简单,这里就不一一解释了。将requestbundleNameabilityName等参数提取到方法中,减少重复代码。constgetParams=function(code){return{messageCode:code,//todo这里修改为你项目的bundleName和abilityNamebundleName:'com.chinasoftinc.event',abilityName:'com.chinasoftinc.event.event.EventInternalAbility',abilityType:1,syncOption:0,data:code,};};订阅消息:subscribeEvent(key,subscribeEventTypes,eventCallback){letsubInfoParams=getParams(Constants.SUBSCRIBE_INFO);subInfoParams.data={"key":key,"subscribeEventTypes":subscribeEventTypes,}FeatureAbility.subscribeAbilityEvent(params,eventCallback)}取消订阅:unsubscribeEvent(key){letparams=getParams(Constants.UNSUBSCRIBE);params.data={"key":key}FeatureAbility.unsubscribeAbilityEvent(params)}发布消息:publishEvent(type,data){letparams=getParams(Constants.PUBLISH_EVENT);params.data={"type":类型,"data":数据,}returnFeatureAbility.callAbility(params)}总结至此,关键代码逻辑已经完成。一般来说,过程比较简单。主要利用JSUI框架提供的FA调PA能力,将JAVA端运行能力提供给JS端。想了解更多开源信息,请访问:51CTO开源基础软件社区https://ost.51cto.com。