一、背景介绍

OpenHarmony 作为分布式操作系统,支持运行在不同的终端设备上。这些终端设备通过跨端迁移和多端协同等,可以为用户提供丰富、流畅的全场景体验。在这种分布式场景下,不同设备之间需要进行数据互通来实现设备间的配合。

下面先看以下这个分布式场景的示例:

示例:可触屏和TV的协作

在 TV/PAD 上观看视频时,在可触屏设备上控制 TV/PAD 上的播放状态、进度、音量和速度等,实现多端控制。

分布式数据对象:超级终端的“全局变量“_鸿蒙开发

图1 多端控制,解放设备限制

要实现上面这个示例的功能,首先必须实现设备之间的数据同步。传统方式下,设备之间的数据同步,需要开发者完成消息处理逻辑,包括:建立通信链接、消息收发处理、错误重试、数据冲突解决等操作,工作量非常大。而且设备越多,调试复杂度将呈指数增长。是否有更简单的实现方式?经过分析,我们发现,示例中的播放状态、进度、音量和速度等其实都是变量。如果这些变量支持“全局”访问,那么开发者跨设备访问这些变量就能像操作本地变量一样,数据就能够自动高效、便捷地实现多端同步了。

为此,本次 OpenHarmony v3.1 Release 版本新增了分布式数据对象特性。分布式数据对象为开发者在分布式应用场景下提供简单易用的 JS 接口,轻松实现多设备间同应用的数据协同,同时设备间可以监听对象的状态和数据变更。与传统方式相比,分布式数据对象大大减少了开发者的工作量。

(为方便描述,后文中“分布式数据对象”也简称为“对象”。)

二、原理解析

这么简单高效的分布式数据对象技术具体如何实现的呢?让我们来一一解析~

1.对象的数据同步

分布式数据对象,最重要的功能就是对象之间的数据同步。可信组网内的设备可以在本地创建分布式数据对象,并设置 sessionID。不同设备上的分布式数据对象,通过设置相同的 sessionID,建立对象之间的同步关系。

如图 3 所示,设备 A 和设备 B 上的“分布式数据对象1”,其 sessionID 均为 session1,这两个对象建立了 session1 的同步关系。

分布式数据对象:超级终端的“全局变量“_鸿蒙开发_02

图2 对象的同步关系

一个同步关系中,一个设备只能有一个对象加入。比如图 3 中,设备 A 的“分布式数据对象 1”已经加入了 session1 的同步关系,所以,设备 A 的“分布式数据对象 2”就加入失败了。

建立同步关系后,每个 session 有一份共享对象数据。加入了同一个 session 的对象,支持以下操作:

(1)读取/修改 session 中的数据。

(2)监听数据变更,感知其他对象对共享对象数据的修改。

(3)监听状态变更,感知其他对象的加入和离开。

关于分布式数据对象的数据同步,值得注意的是,同步的最小单位是“属性”。比如,图 4 中对象 1 包含三个属性:name、age 和 parents。当其中一个属性变更时,则数据同步时只需同步此变更的属性。

分布式数据对象:超级终端的“全局变量“_开发语言_03

2.对象的生命周期

接下来,我们从生命周期的角度来全面认识一下分布式数据对象。

分布式数据对象:超级终端的“全局变量“_鸿蒙开发_04

如图 5 所示,对象包括三种状态:未初始化、本地对象和分布式对象。这三种状态说明如下:

分布式数据对象:超级终端的“全局变量“_openharmony_05

根据条件变化,对象在这三种状态之间会来回切换:

最开始,对象处于未初始化状态。实例化之后,对象就从未初始化状态切换到本地对象状态。给对象设置 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)技术知识点。

分布式数据对象:超级终端的“全局变量“_鸿蒙开发_06

《鸿蒙 (Harmony OS)开发学习手册》(共计892页)

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

分布式数据对象:超级终端的“全局变量“_开发语言_07

开发基础知识:

1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……

分布式数据对象:超级终端的“全局变量“_分布式_08

基于ArkTS 开发

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

分布式数据对象:超级终端的“全局变量“_c#_09

鸿蒙开发面试真题(含参考答案)

分布式数据对象:超级终端的“全局变量“_c#_10

OpenHarmony 开发环境搭建

分布式数据对象:超级终端的“全局变量“_分布式_11

《OpenHarmony源码解析》

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……
  • 系统架构分析
  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

分布式数据对象:超级终端的“全局变量“_分布式_12

OpenHarmony 设备开发学习手册

分布式数据对象:超级终端的“全局变量“_开发语言_13