如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。
1、前 言
本文是基于鸿蒙跨设备协同开发07——动态控制应用接续的进一步讨论。
我们在鸿蒙跨设备协同开发06——应用接续中有提到:
-
为了接续体验,在onContinue回调中使用wantParam传输的数据需要控制在100KB以下(大数据量使用分布式数据对象进行同步)
当我们遇到需要迁移的数据大于100KB时,则需要分布式数据对象进行同步了。
需要注意:
如果是API11及之前版本,实现分布式数据对象同步功能时,需要申请 ohos.permission.DISTRIBUTED_DATASYNC 权限,如果是API 12及以上时,无需申请此权限。
2、分布式数据对象介绍
分布式数据对象提供管理基本数据对象的相关能力,包括创建、查询、删除、修改、订阅等;同时支持相同应用多设备间的分布式数据对象协同能力。
分布式数据对象由 @ohos.data.distributedDataObject 模块提供能力。导入模块代码如下:
import { distributedDataObject } from '@kit.ArkData';
核心的API有:
// 创建一个分布式数据对象
create(context: Context, source: object): DataObject
// 随机创建一个sessionId
genSessionId(): string
创建一个分布式数据对象和随机创建一个sessionId示例如下:
// 创建一个分布式数据对象
// 导入模块
import { UIAbility } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { window } from '@kit.ArkUI';
let g_object: distributedDataObject.DataObject|null = null;
class SourceObject {
name: string
age: number
isVis: boolean
constructor(name: string, age: number, isVis: boolean) {
this.name = name
this.age = age
this.isVis = isVis
}
}
class EntryAbility extends UIAbility {
onWindowStageCreate(windowStage: window.WindowStage) {
let source: SourceObject = new SourceObject("jack", 18, false);
// 创建一个分布式数据对象
g_object = distributedDataObject.create(this.context, source);
}
}
// 创建一个随机sessionId
let sessionId: string = distributedDataObject.genSessionId();
分布式数据对象的使用核心还是在于DataObject,DataObject表示一个分布式数据对象。它主要的API有:
// 设置sessionId,可信组网中有多个设备处于协同状态时,如果多个设备间的分布式对象设置为同一个sessionId,就能自动同步。
// callback接口和Promise接口
setSessionId(sessionId: string, callback: AsyncCallback<void>): void
setSessionId(sessionId?: string): Promise<void>
// 退出所有已加入的session
setSessionId(callback: AsyncCallback<void>): void
// 监听/取消监听 分布式数据对象的数据变更。
on(type: 'change', callback: (sessionId: string, fields: Array<string>) => void): void
off(type: 'change', callback?: (sessionId: string, fields: Array<string>) => void): void
// 监听/取消监听 分布式数据对象的上下线。
on(type: 'status', callback: (sessionId: string, networkId: string, status: 'online' | 'offline' ) => void): void
off(type: 'status', callback?:(sessionId: string, networkId: string, status: 'online' | 'offline') => void): void
// 保存分布式数据对象(callback回调和Promise版本)
/*
对象数据保存成功后,当应用存在时不会释放对象数据,当应用退出后,重新进入应用时,恢复保存在设备上的数据。
有以下几种情况时,保存的数据将会被释放:
- 存储时间超过24小时。
- 应用卸载。
- 成功恢复数据之后。
【deviceId为 local 时,表示存储在本地设备】
*/
save(deviceId: string, callback: AsyncCallback<SaveSuccessResponse>): void
save(deviceId: string): Promise<SaveSuccessResponse></