HarmonyOS 远端状态订阅开发实例

IPC/RPC 提供对远端 Stub 对象状态的订阅机制, 在远端 Stub 对象消亡时,可触发消亡通知告诉本地 Proxy 对象。这种状态通知订阅需要调用特定接口完成,当不再需要订阅时也需要调用特定接口取消。使用这种订阅机制的用户,需要实现消亡通知接口 DeathRecipient 并实现 onRemoteDied 方法清理资源。该方法会在远端 Stub 对象所在进程消亡或所在设备离开组网时被回调。值得注意的是,调用这些接口有一定的顺序。首先,需要 Proxy 订阅 Stub 消亡通知,若在订阅期间 Stub 状态正常,则在不再需要时取消订阅;若在订阅期间 Stub 所在进程退出或者所在设备退出组网,则会自动触发 Proxy 自定义的后续操作。

使用场景

这种订阅机制适用于本地 Proxy 对象需要感知远端 Stub 对象所在进程消亡,或所在设备离开组网的场景。当 Proxy 感知到 Stub 端消亡后,可适当清理本地资源。此外,RPC 目前不提供匿名 Stub 对象的消亡通知,即只有向 SAMgr 注册过的服务才能被订阅消亡通知,IPC 则支持匿名对象的消亡通知。

Native 侧接口

参考代码
 

#include "iremote_broker.h"
#include "iremote_stub.h"//定义消息码
enum {TRANS_ID_PING_ABILITY = 5,TRANS_ID_REVERSED_MONITOR
};const std::string DESCRIPTOR = "test.ITestAbility";class ITestService : public IRemoteBroker {
public:// DECLARE_INTERFACE_DESCRIPTOR是必需的,入参需使用std::u16string;DECLARE_INTERFACE_DESCRIPTOR(to_utf16(DESCRIPTOR));virtual int TestPingAbility(const std::u16string &dummy) = 0; // 定义业务函数
};class TestServiceProxy : public IRemoteProxy<ITestAbility> {
public:explicit TestAbilityProxy(const sptr<IRemoteObject> &impl);virtual int TestPingAbility(const std::u16string &dummy) override;int TestAnonymousStub();
private:static inline BrokerDelegator<TestAbilityProxy> delegator_; // 方便后续使用iface_cast宏
};TestServiceProxy::TestServiceProxy(const sptr<IRemoteObject> &impl): IRemoteProxy<ITestAbility>(impl)
{
}int TestServiceProxy::TestPingAbility(const std::u16string &dummy){MessageOption option;MessageParcel dataParcel, replyParcel;dataParcel.WriteString16(dummy);int error = PeerHolder::Remote()->SendRequest(TRANS_ID_PING_ABILITY, dataParcel, replyParcel, option);int result = (error == ERR_NONE) ? replyParcel.ReadInt32() : -1;return result;
}
#include "iremote_object.h"class TestDeathRecipient : public IRemoteObject::DeathRecipient {
public:virtual void OnRemoteDied(const wptr<IRemoteObject>& remoteObject);
}void TestDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& remoteObject)
{
}
sptr<IPCObjectProxy> object = new IPCObjectProxy(1, to_utf16(DESCRIPTOR));
sptr<IRemoteObject::DeathRecipient> deathRecipient (new TestDeathRecipient());// 构造一个消亡通知对象
bool result = object->AddDeathRecipient(deathRecipient); // 注册消亡通知
result = object->RemoveDeathRecipient(deathRecipient); // 移除消亡通知

JS 侧接口

参考代码

import FA from "@ohos.ability.featureAbility";let proxy;let connect = {    onConnect: function(elementName, remoteProxy) {        console.log("RpcClient: js onConnect called.");        proxy = remoteProxy;    },    onDisconnect: function(elementName) {        console.log("RpcClient: onDisconnect");    },    onFailed: function() {        console.log("RpcClient: onFailed");    }};let want = {    "bundleName": "com.ohos.server",    "abilityName": "com.ohos.server.MainAbility",};FA.connectAbility(want, connect);class MyDeathRecipient {    onRemoteDied() {        console.log("server died");    }}let deathRecipient = new MyDeathRecipient();proxy.addDeathRecipient(deathRecipient, 0);proxy.removeDeathRecipient(deathRecipient, 0);

Stub 感知 Proxy 消亡(匿名 Stub 的使用)

正向的消亡通知是 Proxy 感知 Stub 的状态,若想达到反向的死消亡通知,即 Stub 感知 Proxy 的状态,可以巧妙的利用正向消亡通知。如两个进程 A(原 Stub 所在进程)和 B(原 Proxy 所在进程),进程 B 在获取到进程 A 的 Proxy 对象后,在 B 进程新建一个匿名 Stub 对象(匿名指未向 SAMgr 注册),可称之为回调 Stub,再通过 SendRequest 接口将回调 Stub 传给进程 A 的原 Stub。这样一来,进程 A 便获取到了进程 B 的回调 Proxy。当进程 B 消亡或 B 所在设备离开组网时,回调 Stub 会消亡,回调 Proxy 会感知,进而通知给原 Stub,便实现了反向消亡通知。

注意:

反向死亡通知仅限设备内跨进程通信使用,不可用于跨设备。

当匿名 Stub 对象没有被任何一个 Proxy 指向的时候,内核会自动回收。

参考代码

//Proxyint TestAbilityProxy::TestAnonymousStub(){    MessageOption option;    MessageParcel dataParcel, replyParcel;    dataParcel.UpdateDataVersion(Remote());    dataParcel.WriteRemoteObject(new TestAbilityStub());    int error = Remote()->SendRequest(TRANS_ID_REVERSED_MONITOR,dataParcel, replyParcel, option);    int result = (error == ERR_NONE) ? replyParcel.ReadInt32() : -1;    return result;}
//Stub
int TestAbilityStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option){    switch (code) {        case TRANS_ID_REVERSED_MONITOR: {            sptr<IRemoteObject> obj = data.ReadRemoteObject();            if (obj == nullptr) {                reply.WriteInt32(ERR_NULL_OBJECT);                return ERR_NULL_OBJECT;            }            bool result = obj->AddDeathRecipient(new TestDeathRecipient());            result ? reply.WriteInt32(ERR_NONE) : reply.WriteInt32(-1);            break;        }        default:            break;    }    return ERR_NONE;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/133950.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

clone()方法使用时遇到的问题解决方法(JAVA)

我们平时在自定义类型中使用这个方法时会连续遇到 4 个问题。 基础代码如下&#xff1a; class A {int[] a {1,2,3}; }public class Test {public static void main(String[] args) {} } 第一个&#xff1a; 当我们直接调用时报错原因是Object类中的clone方法是被protecte…

竞赛 深度学习 YOLO 实现车牌识别算法

文章目录 0 前言1 课题介绍2 算法简介2.1网络架构 3 数据准备4 模型训练5 实现效果5.1 图片识别效果5.2视频识别效果 6 部分关键代码7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于yolov5的深度学习车牌识别系统实现 该项目较…

支付宝企业转账到个人账号[新接口版](php源码,亲测)

前言 之前专栏写过一篇企业支付宝转账到个人的文章,里面用的是老接口,官方已经不再维护。最近有人找到帮忙使用新接口实现这个功能,看了下文档以及官方的sdk,为了这一个接口,我还要去下载官方庞大的sdk,而且php低版本的还不支持composer,就很离谱,经过一天的研究,把单…

Pytorch之ConvNeXt图像分类

文章目录 前言一、ConvNeXt设计决策1.设计方案2.Training Techniques3.Macro Design&#x1f947;Changing stage compute ratio&#x1f948;Change stem to "Patchify" 4.ResNeXt-ify5. Inverted Bottleneck6.Large Kernel Size7.Micro Design✨Replacing ReLU wit…

Diffusion Model论文/DALL E 2

B站视频学习记录 Ho J, Jain A, Abbeel P. Denoising diffusion probabilistic models[J]. Advances in neural information processing systems, 2020, 33: 6840-6851. Atwood J, Towsley D. Diffusion-convolutional neural networks[J]. Advances in neural information pro…

基于PLC的机械手控制系统设计

目录 摘 要......................................................................................................................... 1 第一章 绪论.............................................................................................................…

接口

一、认识接口 public interface A {//成员变量&#xff08;常量&#xff09;String NAME"啦啦啦";//成员方法 抽象方法void test();//不能有代码块 // static {}//不能有构造器 // public A{ // // }// 接口不能创建对象 }二、接口的好处 三、JDK8 接口新增…

【单片机】19-TFT彩屏

一、背景知识--显示器 1.什么是TFT &#xff08;1&#xff09;LCD显示器的构成&#xff1a;液晶面板驱动器【电压驱动】控制器【逻辑控制】 &#xff08;2&#xff09;液晶面板大致分为&#xff1a;TN&#xff0c;TFT&#xff0c;IPS等 &#xff08;3&#xff09;驱动器是跟随…

dpdk/spdk/网络协议栈/存储/网关开发/网络安全/虚拟化/ 0vS/TRex/dpvs技术专家成长体系教程

课程围绕安全&#xff0c;网络&#xff0c;存储&#xff0c;云原生4个维度去讲解核心技术点。 6个专栏组成&#xff1a;dpdk网络专栏、存储技术专栏、安全与网关开发专栏、虚拟化与云原生专栏、测试工具专栏、性能测试专栏 一、dpdk网络 dpdk基础知识 多队列网卡&#xff0…

AI算法平台及视频智能分析系统在高速公路场景中的智能化应用

一、行业背景 当前高速公路视频联网运行监测体系的建设思路&#xff0c;主要是改变过去烟筒式的建设模式&#xff0c;搭建以视频数据为核心的视频综合管理云服务中台&#xff0c;在全面汇聚基础数据的基础上通过数据智能支撑各部门和公司的应用需求。当前面临的建设需求如下&a…

06-Zookeeper选举Leader源码剖析

上一篇&#xff1a;05-Zookeeper典型使用场景实战 一、为什么要看源码 提升技术功底&#xff1a;学习源码里的优秀设计思想&#xff0c;比如一些疑难问题的解决思路&#xff0c;还有一些优秀的设计模式&#xff0c;整体提升自己的技术功底深度掌握技术框架&#xff1a;源码看多…

论文导读 | 7月8月上旬MSOM文章精选

编者按 淘宝店承诺的交货时间早些还是晚些更有利&#xff1f; 波动的市场环境下如何进行分布式储能的选址与运营&#xff1f; 企业存在服务竞争时如何对待“共享库存”这一模式&#xff1f; 网约车平台在线派单时能否综合权衡司机资质、等待时间、订单远近等多种因素&#xff1…