恢弘志士之气,不宜妄自菲薄。这篇文章主要讲述HarmonyOS 使用FA调PA能力实现JS消息订阅功能相关的知识,希望能为你提供帮助。
作者: 余香鑫
前言【HarmonyOS 使用FA调PA能力实现JS消息订阅功能】目前JS UI框架提供的事件发布订阅功能需要在API7版本上才能使用, 为满足开发需求, 我们在java侧实现消息订阅分发逻辑, 通过JS调JAVA能力将接口暴露给JS侧, 以实现消息订阅发布能力
效果展示
文章图片
实现思路 1. 定义消息数据
一个消息事件包含事件类型, 携带数据, 我们先定义一个JavaBean对象表示消息数据
class Event
private String type;
private String data;
2. 定义接口
消息数据模型有了, 可以开始定义接口了.
- 消息订阅接口,
key
用于表示订阅者对象的标识.callback
是消息的回调接口, 我们希望订阅者只接收到自己关心的事件, 所以还需要增加一个参数subscribeEventTypes
表示关心的事件类型
void subscribeEvent(key, subscribeEventTypes, callback)
- 取消订阅接口
有订阅就会有取消,key
用于表示订阅者对象的唯一标识
void unSubscribeEvent(key)
- 发布消息接口
发布消息接口,type
表示消息类型,data
表示携带的数据
void publishEvent(type, data)
我们采用的是是PA调FA机制, 所以需要新建一个JAVA远程服务Ability, 目前有
Server
和Internal
两种类型的服务Ability, 此处不需要考虑多进程和 生命周期问题, 所以这里使用Internal
Ability.3.1 先创建一个类EventInternalAbility, 调用
setInternalAbilityHandler
接口实现JS侧请求处理接口, 处理三种请求public class EventInternalAbility extends AceInternalAbility
private final ConcurrentHashMap<
String, EventObserver>
observers = new ConcurrentHashMap<
>
(10);
private EventInternalAbility()
setInternalAbilityHandler(this::onRemoteRequest);
private boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option)
switch (code)
case SUBSCRIBE: // 处理订阅消息请求
addObserver();
break;
case UNSUBSCRIBE: // 处理取消订阅消息请求
removeObserver();
break;
case PUBLISH_EVENT: // 处理消息分发
publishEvent();
break;
return true;
3.2 处理订阅消息请求, 我们需要在此函数下处理消息订阅的事件类型和订阅对象
public class EventInternalAbility
private void addObserver(MessageParcel data)
JSON dataJson = new JSON(data.readString());
// 解析订阅者的标识
String key = dataJson.get("key");
// 解析订阅者关系的数据
List<
String>
subscribeEventTypes = dataJson.get("subscribeEventType");
// 添加订阅者到map队列中
observers.put(key, new EventObserver(subscribeEventTypes, data.readRemoteObject()));
3.3 处理取消订阅消息请求, 此逻辑比较简单, 将标识对应的订阅对象移除即可
observers.remove(key)
3.4 处理消息分发请求, 我们需要在此函数下完成消息数据解析和消息分发处理
public class EventInternalAbility
private void publishEvent(MessageParcel data)
// 解析数据
JSON dataJson = new JSON(data.readString());
Stirng eventType = dataJson.get("type");
Stirng eventData = https://www.songbingjia.com/android/dataJson.get("data");
// 分发消息
observers.forEach((key, eventObserver) ->
if (eventObserver.getSubscribeEventType().contains(eventType))
eventObserver.handlenEvent(eventType, eventData);
);
3.5 到此我们JAVA侧的关键代码已经完成, 我们还需要在应用启动入口添加启动
EventInternalAbility
服务public class EventInternalAbility
private static final EventInternalAbility INSTANCE = new EventInternalAbility();
// 添加启动服务分发
public static void startServer()
// 我们与已经在构造函数下实现了JS侧请求处理接口, 此处可为空public class MyApplication extends AbilityPackage
@Override
public void onInitialize()
super.onInitialize();
// 在APP入口启动服务
EventInternalAbility.startServer();
4. JS侧逻辑
新建event-utils.js脚本文件, 实现上述定义的接口;
JS侧的代码比较简单, 主要将入参的数据透传给JAVA侧, 逻辑比较简单, 此处不再一一讲解
- 将请求bundleName abilityName等参数抽为一个方法, 以减少重复代码
const getParams = function (code)
return
messageCode: code,
// todo 此处修改为你项目的bundleName和abilityName
bundleName: com.chinasoftinc.event,
abilityName: com.chinasoftinc.event.event.EventInternalAbility,
abilityType: 1,
syncOption: 0,
data: code,
;
;
- 订阅消息
subscribeEvent(key, subscribeEventTypes, eventCallback)
let subInfoParams = getParams(Constants.SUBSCRIBE_INFO);
subInfoParams.data =
"https://www.songbingjia.com/android/key": key,
"subscribeEventTypes": subscribeEventTypes,FeatureAbility.subscribeAbilityEvent(params, eventCallback)
- 取消订阅
unsubscribeEvent(key)
let params = getParams(Constants.UNSUBSCRIBE);
params.data =
"https://www.songbingjia.com/android/key": keyFeatureAbility.unsubscribeAbilityEvent(params)
- 发布消息
publishEvent(type, data)
let params = getParams(Constants.PUBLISH_EVENT);
params.data =
"https://www.songbingjia.com/android/type": type,
"data": data,returnFeatureAbility.callAbility(params)
总结
文章图片
至此关键代码逻辑已全部完成, 总体来说流程比较简单, 主要使用JS UI框架提供的FA调PA能力, 将JAVA侧的操作能力提供给JS侧使用.
完整项目代码可以前往Gitee查看
更多原创内容请关注:中软国际 HarmonyOS 技术团队入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。
想了解更多关于开源的内容,请访问:
51CTO 开源基础软件社区
https://ost.51cto.com/#bkwz
推荐阅读
- Nacos Config 动态刷新源码剖析
- electron学习笔记electron之打包程序file路径的刷新页面处理
- Java 更新和删除PDF中的超链接
- 基于加速度的路面平整度检测及评价
- 阿里云618有奖体验(使用PolarDB和ECS搭建门户网站)
- 一起学习华为自研数据库GaussDB(DWS)这次高斯不是数学家
- 快问快答—腾讯云服务器常见问题解答
- MDT8456部署Windows系列 : 技巧篇—模拟测试部署系统快速定位错误配置
- 什么是DevOps?为大家都在用DevOps