HarmonyOS 远端状态订阅开发实例

news2025/6/23 2:29:45

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.coloradmin.cn/o/1086334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

金融新应用潮涌,银行如何加强数据安全韧性?

文 | 螳螂观察 作者 | 李永华 竞争白热化下&#xff0c;业务创新已经成为银行等金融企业普遍的追求。 以地方商业银行为代表&#xff0c;为了争夺市场、突破“大行”势能、让企业发展更进一步&#xff0c;新型应用正在快速落地&#xff0c;带来全新的竞争力。 但是&#xf…

Winform圆角用户控件的软件实现

1、文件结构 2、控件视图 3、程序代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading…

数码品牌这样做,教你实现用户增长

随着人工智能、移动互联网等新技术的不断发展&#xff0c;人们对数码产品的消费需求也在不断更新&#xff0c;这也给整个数码行业带来了消费与变革&#xff0c;在竞争激烈的数码市场上&#xff0c;数码品牌应该怎么做才能实现用户增长呢&#xff1f;可以试试软文&#xff0c;接…

UnityShaderLab —— 模型裁剪效果

首先定义一个裁剪范围&#xff0c; _DisappearOffset("offset",Range(-1,1)) 1 在顶点着色器中&#xff0c;取某个轴的值与裁剪的数相减存储在UV的z分量中 v2f vert (appdata v){v2f o;o.pos UnityObjectToClipPos(v.pos);o.uv.xy v.uv;o.uv.z _DisappearOffse…

02Linux各目录及每个目录的详细介绍

【常见目录说明】 目录/bin存放二进制可执行文件(ls,cat,mkdir等)&#xff0c;常用命令一般都在这里。/etc存放系统管理和配置文件/home存放所有用户文件的根目录&#xff0c;是用户主目录的基点&#xff0c;比如用户user的主目录就是/home/user&#xff0c;可以用~user表示/u…

app移动广告变现,开发者如何选择和管理聚合广告平台?

目前app广告变现成熟的变现体系由两部分组成&#xff0c;首先开发要选一个合适的广告聚合平台&#xff0c;对接SDK文档嵌入到app中&#xff0c;再基于此聚合广告平台&#xff0c;提升变现收益。 https://www.shenshiads.com/news_list 对于中小app&#xff0c;团队的资源有限…

WorkPlus安全专属的企业IM助力政企高效协作

在当今高度竞争的商业环境中&#xff0c;高效的内部沟通和协作成为企业取得成功的关键。企业IM系统因其便捷、安全和高效的特点&#xff0c;成为企业管理中不可或缺的一部分。WorkPlus作为领先品牌&#xff0c;在企业IM系统领域脱颖而出&#xff0c;为企业提供全面解决方案&…

FPGA coaxpress 2.0 ip

CoaXPress是一种高速串行接口技术&#xff0c;可以实现高带宽、长距离传输和多通道传输。CoaXPress图像采集卡通常具有多个CoaXPress接口&#xff0c;可以同时连接多个相机&#xff0c;实现多通道的图像采集。它们通常具有高速数据传输能力&#xff0c;可以实时采集和传输高分辨…

嵌入式养成计划-40----C++菱形继承--虚继承--多态--模板--异常

九十四、菱形继承 94.1 概念 菱形继承又称为钻石继承&#xff0c;是由公共基类派生出多个中间子类&#xff0c;又由中间子类共同派生出汇聚子类&#xff0c;汇聚子类会得到多份中间子类从公共基类继承下来的数据成员&#xff0c;会造成空间浪费&#xff0c;没有必要。 所以存…

MQ - 42 消息中台:搭建企业内部统一的消息服务

文章目录 导图概述统一的消息服务PaaS 化和中台化Pass VS 中台 方案比对PaaS 化的技术实现分析中台化的技术实现分析存储引擎的选择接入层协议设计接入层开发自定义 SDK 开发配套基础设施总结导图 概述 MQ - 02 基础篇_通讯协议我们知道了协议分为公有协议和私有协议。

墨者学院 Apache Struts2远程代码执行漏洞(S2-032)

命令执行 打开 web 页面&#xff1a; 利用Struts2工具进行远程命令执行

Linux 离线安装最新Python(3.12)设置独立virtualenv(venv)环境

目录 Linux安装最新Python 操作系统环境 1. 下载最新Python离线安装包 2. 安装最新Python 3. 验证 4. 卸载Python 设置独立virtualenv&#xff08;venv&#xff09;环境 1. 安装virtualenv 2. 设置独立venv 3. 在虚拟环境中安装pip依赖包 4. 卸载虚拟环境 Linux安装最…

【算法练习Day18】二叉搜索树的最小绝对差二叉搜索树中的众数 二叉树的最近公共祖先

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 二叉搜索树的最小绝对差二叉…

k8s相关的概念

1.1 K8S YAML文件详解 K8S Yaml 配置文件主要分为&#xff1a;基本标签、元数据标签、资源内容 三个部分&#xff0c;要想对K8S熟练的掌握&#xff0c;必须要了解YAML配置文件中常见的参数和指令的含义。 1&#xff09;基本标签主要是在文件起始位置&#xff0c;例如&#xff…

基于JAVA+SpringBoot+Vue的前后端分离的公益慈善服务平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着网络技术的发展&a…

2023年中国企业营销数字化行业发展趋势分析:企业营销数字化花费增速放缓[图]

随着通信设施和移动互联网的高速发展&#xff0c;中国MarTech市场也面临着一些挑战&#xff0c;在企业数字化转型的浪潮中&#xff0c;通过供需双方共同发力、技术能力不断升级和市场宏观环境的共同加持&#xff0c;助力中国企业营销数字化的发展。 中国企业营销数字化发展脉络…

postman介绍和安装,发送带参数的GET请求(超详细~)

postman的介绍和安装 Postman的介绍 Postman 是一款谷歌开发的接口测试工具,使API的调试与测试更加便捷。 它提供功能强大的 Web API & HTTP 请求调试。它能够发送任何类型的HTTP 请求 (GET, HEAD, POST, PUT..)&#xff0c;附带任何数量的参数 headers。 postman是一款…

Docker快速上手:使用Docker部署Drupal并实现公网访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。它的学习…

视频编解码(七)之FOURCC和YUV关系简介

FOURCC是4字节代码&#xff0c;是一个codec中对压缩格式、颜色、像素格式等的标识。按一个字节8bit&#xff0c;FOURCC通常占4字节32bit。 FOURCC is short for “four character code” - an identifier for a video codec, compression format, color or pixel format used i…

1600*C. Circle of Monsters(贪心)

Problem - 1334C - Codeforces 解析&#xff1a; 对于某个怪兽&#xff0c;他的耗费为两种情况&#xff0c;要么直接用子弹打&#xff0c;要么被前面的怪兽炸&#xff0c;显然第二种情况耗费更少。 统计出所有怪兽的 max&#xff08;0&#xff0c;a[ i ] - b[ i - 1 ]&#xff…