Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
bb076cd6
D
Docs
项目概览
OpenHarmony
/
Docs
1 年多 前同步成功
通知
159
Star
292
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
bb076cd6
编写于
12月 17, 2022
作者:
W
wangqilong2
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
【修改】12-17
Signed-off-by:
N
wangqilong2
<
wangqilong2@huawei.com
>
上级
07397d9f
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
52 addition
and
4 deletion
+52
-4
zh-cn/application-dev/connectivity/ipc-rpc-development-guideline.md
...ication-dev/connectivity/ipc-rpc-development-guideline.md
+0
-1
zh-cn/application-dev/connectivity/subscribe-remote-state.md
zh-cn/application-dev/connectivity/subscribe-remote-state.md
+52
-3
未找到文件。
zh-cn/application-dev/connectivity/ipc-rpc-development-guideline.md
浏览文件 @
bb076cd6
...
@@ -161,7 +161,6 @@ include_dirs = [
...
@@ -161,7 +161,6 @@ include_dirs = [
```
```
import rpc from "@ohos.rpc"
import rpc from "@ohos.rpc"
import featureAbility from "@ohos.ability.featureAbility"
import featureAbility from "@ohos.ability.featureAbility"
]
```
```
2.
客户端构造变量want,指定要绑定的Ability所在应用的包名、组件名,如果是跨设备的场景,还需要目标设备NetworkId。构造变量connect,指定绑定成功、绑定失败、断开连接时的回调函数。使用featureAbility提供的接口绑定Ability。
2.
客户端构造变量want,指定要绑定的Ability所在应用的包名、组件名,如果是跨设备的场景,还需要目标设备NetworkId。构造变量connect,指定绑定成功、绑定失败、断开连接时的回调函数。使用featureAbility提供的接口绑定Ability。
...
...
zh-cn/application-dev/connectivity/subscribe-remote-state.md
浏览文件 @
bb076cd6
...
@@ -15,20 +15,69 @@ IPC/RPC提供对远端Stub对象状态的订阅机制, 在远端Stub对象死
...
@@ -15,20 +15,69 @@ IPC/RPC提供对远端Stub对象状态的订阅机制, 在远端Stub对象死
| RemoveDeathRecipient(const sptr
\<
DeathRecipient>
&recipient);
| bool | 取消订阅远端Stub对象状态。 |
| RemoveDeathRecipient(const sptr
\<
DeathRecipient>
&recipient);
| bool | 取消订阅远端Stub对象状态。 |
| OnRemoteDied(const wptr
\<
IRemoteObject>
&object);
| void | 当远端Stub对象死亡时回调。 |
| OnRemoteDied(const wptr
\<
IRemoteObject>
&object);
| void | 当远端Stub对象死亡时回调。 |
### 参考代码
### 参考代码
```
C++
//定义消息码
enum {
TRANS_ID_PING_ABILITY = 5,
TRANS_ID_REVERSED_MONITOR
};
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;
}
```
```
```
class TestDeathRecipient : public IRemoteObject::DeathRecipient {
class TestDeathRecipient : public IRemoteObject::DeathRecipient {
public:
public:
virtual void OnRemoteDied(const wptr<IRemoteObject>& remoteObject);
virtual void OnRemoteDied(const wptr<IRemoteObject>& remoteObject);
}
}
void TestDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& remoteObject)
{
}
```
```
c++
sptr
<
IPCObjectProxy
>
object
=
new
IPCObjectProxy
(
1
,
to_utf16
(
DESCRIPTOR
));
sptr
<
IRemoteObject
::
DeathRecipient
>
deathRecipient
(
new
TestDeathRecipient
());
// 构造一个死亡通知对象
sptr
<
IRemoteObject
::
DeathRecipient
>
deathRecipient
(
new
TestDeathRecipient
());
// 构造一个死亡通知对象
bool result =
proxy
->AddDeathRecipient(deathRecipient); // 注册死亡通知
bool
result
=
object
->
AddDeathRecipient
(
deathRecipient
);
// 注册死亡通知
result =
proxy
->RemoveDeathRecipient(deathRecipient); // 移除死亡通知
result
=
object
->
RemoveDeathRecipient
(
deathRecipient
);
// 移除死亡通知
```
```
## Stub感知Proxy死亡(匿名Stub的使用)
## 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,便实现了反向死亡通知。
正向的死亡通知是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,便实现了反向死亡通知。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录