HarmonyOS鸿蒙Next远端状态订阅开发实例
HarmonyOS鸿蒙Next远端状态订阅开发实例 IPC/RPC提供对远端Stub对象状态的订阅机制,在远端Stub对象消亡时,可触发消亡通知告诉本地Proxy对象。这种状态通知订阅需要调用特定接口完成,当不再需要订阅时也需要调用特定接口取消。使用这种订阅机制的用户,需要实现消亡通知接口DeathRecipient并实现onRemoteDied方法清理资源。该方法会在远端Stub对象所在进程消亡或所在设备离开组网时被回调。值得注意的是,调用这些接口有一定的顺序。首先,需要Proxy订阅Stub消亡通知,若在订阅期间Stub状态正常,则在不再需要时取消订阅;若在订阅期间Stub所在进程退出或者所在设备退出组网,则会自动触发Proxy自定义的后续操作。
使用场景
这种订阅机制适用于本地Proxy对象需要感知远端Stub对象所在进程消亡,或所在设备离开组网的场景。当Proxy感知到Stub端消亡后,可适当清理本地资源。此外,RPC目前不提供匿名Stub对象的消亡通知,即只有向SAMgr注册过的服务才能被订阅消亡通知,IPC则支持匿名对象的消亡通知。
Native侧接口
接口名 | 返回值类型 | 功能描述 |
---|---|---|
AddDeathRecipient(const sptr<DeathRecipient> &recipient); | bool | 订阅远端Stub对象状态。 |
RemoveDeathRecipient(const sptr<DeathRecipient> &recipient); | bool | 取消订阅远端Stub对象状态。 |
OnRemoteDied(const wptr<IRemoteObject> &object); | void | 当远端Stub对象死亡时回调。 |
JS侧接口
接口名 | 返回值类型 | 功能描述 |
---|---|---|
addDeathRecipient | boolean | 注册用于接收远程对象消亡通知的回调,增加proxy对象上的消亡通知。 |
removeDeathRecipient | boolean | 注销用于接收远程对象消亡通知的回调。 |
onRemoteDied | void | 在成功添加死亡通知订阅后,当远端对象死亡时,将自动调用本方法。 |
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指向的时候,内核会自动回收。
更多关于HarmonyOS鸿蒙Next远端状态订阅开发实例的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS鸿蒙Next远端状态订阅开发实例的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,远端状态订阅是一种实现设备间状态同步的机制。开发实例通常包括以下步骤:
- 定义状态类:创建一个表示远端状态的数据类,例如
RemoteStatus
。 - 实现状态提供者:在提供者设备上实现
StatusProvider
接口,提供状态更新逻辑。 - 注册状态提供者:在提供者设备上注册
StatusProvider
,使其可被其他设备发现。 - 实现状态观察者:在观察者设备上实现
StatusObserver
接口,接收状态更新。 - 订阅状态:在观察者设备上通过
StatusManager
订阅提供者的状态。
代码示例:
// 提供者设备
public class MyStatusProvider implements StatusProvider {
@Override
public void onStatusChanged(RemoteStatus status) {
// 更新状态
}
}
// 观察者设备
public class MyStatusObserver implements StatusObserver {
@Override
public void onStatusChanged(RemoteStatus status) {
// 处理状态更新
}
}
// 订阅状态
StatusManager.subscribe(deviceId, new MyStatusObserver());
通过这些步骤,设备间可以实现状态的实时同步。