一、背景介绍
OpenHarmony 作为分布式操作系统,支持运行在不同的终端设备上。这些终端设备通过跨端迁移和多端协同等,可以为用户提供丰富、流畅的全场景体验。在这种分布式场景下,不同设备之间需要进行数据互通来实现设备间的配合。
下面先看以下这个分布式场景的示例:
示例:可触屏和TV的协作
在 TV/PAD 上观看视频时,在可触屏设备上控制 TV/PAD 上的播放状态、进度、音量和速度等,实现多端控制。
图1 多端控制,解放设备限制
要实现上面这个示例的功能,首先必须实现设备之间的数据同步。传统方式下,设备之间的数据同步,需要开发者完成消息处理逻辑,包括:建立通信链接、消息收发处理、错误重试、数据冲突解决等操作,工作量非常大。而且设备越多,调试复杂度将呈指数增长。是否有更简单的实现方式?经过分析,我们发现,示例中的播放状态、进度、音量和速度等其实都是变量。如果这些变量支持“全局”访问,那么开发者跨设备访问这些变量就能像操作本地变量一样,数据就能够自动高效、便捷地实现多端同步了。
为此,本次 OpenHarmony v3.1 Release 版本新增了分布式数据对象特性。分布式数据对象为开发者在分布式应用场景下提供简单易用的 JS 接口,轻松实现多设备间同应用的数据协同,同时设备间可以监听对象的状态和数据变更。与传统方式相比,分布式数据对象大大减少了开发者的工作量。
(为方便描述,后文中“分布式数据对象”也简称为“对象”。)
二、原理解析
这么简单高效的分布式数据对象技术具体如何实现的呢?让我们来一一解析~
1.对象的数据同步
分布式数据对象,最重要的功能就是对象之间的数据同步。可信组网内的设备可以在本地创建分布式数据对象,并设置 sessionID。不同设备上的分布式数据对象,通过设置相同的 sessionID,建立对象之间的同步关系。
如图 3 所示,设备 A 和设备 B 上的“分布式数据对象1”,其 sessionID 均为 session1,这两个对象建立了 session1 的同步关系。
图2 对象的同步关系
一个同步关系中,一个设备只能有一个对象加入。比如图 3 中,设备 A 的“分布式数据对象 1”已经加入了 session1 的同步关系,所以,设备 A 的“分布式数据对象 2”就加入失败了。
建立同步关系后,每个 session 有一份共享对象数据。加入了同一个 session 的对象,支持以下操作:
(1)读取/修改 session 中的数据。
(2)监听数据变更,感知其他对象对共享对象数据的修改。
(3)监听状态变更,感知其他对象的加入和离开。
关于分布式数据对象的数据同步,值得注意的是,同步的最小单位是“属性”。比如,图 4 中对象 1 包含三个属性:name、age 和 parents。当其中一个属性变更时,则数据同步时只需同步此变更的属性。
2.对象的生命周期
接下来,我们从生命周期的角度来全面认识一下分布式数据对象。
如图 5 所示,对象包括三种状态:未初始化、本地对象和分布式对象。这三种状态说明如下:
根据条件变化,对象在这三种状态之间会来回切换:
最开始,对象处于未初始化状态。实例化之后,对象就从未初始化状态切换到本地对象状态。给对象设置 sessionID,收到对端设备对象上线通知后,此时可以跨设备同步数据了,对象就进入了分布式对象状态。
本端或远端设备下线,或者 sessionID 被清除,那么对象又切回本地对象状态。分布式对象实例和对应的内存数据库都保存在应用程序的进程空间,当应用程序退出后,分布式对象和内存数据库也随之销毁,对象直接进入未初始化状态。
三、开发约束及案例
经过上面的介绍,大家对分布式数据对象已经有了充分的了解了,下面就要介绍开发者们最关心的“怎么用”的问题了。
在使用分布式数据对象之前,我们先说明一下相关的开发约束:
1. 单个应用程序最多只能创建 16 个分布式数据对象实例。
2. 考虑到性能和用户体验,最多不超过 3 个设备进行数据协同。
3. 考虑到性能和用户体验,分布式数据对象大小限制在 500KB 以内。
4. 分布式数据对象的数据同步发生在同一个应用程序下,且同 session ID 之间。
接下来,我们通过一个简单的开发案例来讲解如何使用分布式数据对象。此案例中,设备 A 和设备 B 分别创建一个包含 3 个属性的对象,这两个对象加入到同一个 session,建立同步关系。一个对象的属性变更会自动同步到另一个对象,从而实现“全局变量”效果。
通过此案例,我们能够掌握分布式数据对象的基本操作,包括:
1. 创建对象
2. 设置 sessionID
3. 设置监听对象变更的回调
4. 监听状态变更
代码示例如下:
1. 设备 A 的 JS 代码示例:
import distributedObject from '@ohos.data.distributedDataObject'
//创建对象,对象包含三个属性:name、age和isVis
var g_object = distributedObject.createDistributedObject({name:"Amy",
age:18, isVis:false});
//设置sessionID为“123456”
g_object.setSessionId("123456");
//设置监听对象变更的回调
changeCallback : function (sessionId, changeData) {
if (changeData != null && changeData != undefined) {
changeData.forEach(element => {
console.info("changed !" + element + " " + g_object[element]);
});
}
}
g_object.on("change", this.changeCallback);
2. 设备 B 的 JS 代码示例:
//创建对象,对象包含三个属性:name、age和isVis
var g_object = distributedObject.createDistributedObject({name:"Amy",
age:undefined, isVis:false});
//设置sessionID为“123456”,这个session里已经有设备A的对象
g_object.setSessionId("123456");
//监听状态变更
statusCallback : function (sessionId, networkid, status) {
//成功加入session并检测到设备A上线
if (status == "online" && networkid == networkid_A) {
//此时设备A的age值是18,而本地age值是undefined,通过console.info自动同步设备A的
age数据到本地。如果想使用本地数据,可以把age初始值改为有效值,像name一样。
console.info ("age = {g_object.age}");
g_object.name = "jack";
//此时设备A的changeCallback收到对象变更的回调,打印出“changed !name jack”。
//后续使用g_object.做的属性修改都会自动同步给设备A,同时g_object.属性访问的数据都
是session中的最新数据(也包括设备A上的修改)。设备A和B相当于使用同一个全局变量g_object。
}
}
g_object.on("status", this.statusCallback);
经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?
为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。
《鸿蒙 (Harmony OS)开发学习手册》(共计892页)
如何快速入门?
1.基本概念
2.构建第一个ArkTS应用
3.……
开发基础知识:
1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……
基于ArkTS 开发
1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……
鸿蒙开发面试真题(含参考答案)
OpenHarmony 开发环境搭建
《OpenHarmony源码解析》
- 搭建开发环境
- Windows 开发环境的搭建
- Ubuntu 开发环境搭建
- Linux 与 Windows 之间的文件共享
- ……
- 系统架构分析
- 构建子系统
- 启动流程
- 子系统
- 分布式任务调度子系统
- 分布式通信子系统
- 驱动子系统
- ……
OpenHarmony 设备开发学习手册