为有牺牲多壮志,敢教日月换新天。

HarmonyOS:可分可合,自由流转

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ 
➤GitHub地址:https://github.com/strengthen
➤原文地址:https://www.cnblogs.com/strengthen/p/18513969
➤如果链接不是为敢技术的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

  

一、自由流转的定义和体验
自由流转加上多设备就容易理解了。多设备的自由流转。
1、多设备的交互场景,按照时间的串、并行分为以下两种情况:
(1)、串行交互:指用户相继使用多个设备,此类交互场景要求具备较高的连续性和一致性。
连续性:指当用户从一个设备转向两个设备的时候,最新的操作状态应当是继续保留的,未被中断的。
一致性:指当用户在使用手机、手表、大屏等不同设备等时候,交互方式与基础视觉元素应当是一致的。例如:多指手势、控件样式等。这里的一致并不等同于相同,由于设备的屏幕尺寸、形态的不同,视觉元素可以进行适配调整。
(2)、并行交互:指用户同时使用多个设备,此类交互场景要求具备较高的并发性、协作性和互补性。
并发性:指的是某一业务在多个设备同时呈现。
协作性:指的是多个设备彼此交互协调完成一项任务。
互补性:指的是利用设备的本身形态差异完成一项任务。
2、对于并行交互与串行交互两者典型场景,HarmonyOS分布式运行环境分别提供了与之对应的基础能力。跨端迁移、多端协同统称为“自由流转”。
(1)、串行交互:相继使用(Sequential),跨端迁移。
(2)、并行交互:同时使用(Simultaneous),多端协同。

3、跨端迁移:指将一个软件实体,从一台设备转移到另外一台设备上运行。可以理解为用户使用应用的情境发生变化时,例如从室内走到户外、从办公室到车上等。之前使用的设备,可能已经不适合继续当前的任务,或者周围有更合适的设备,此时可以选择使用新的设备来继续当前的任务。比如本例:在观完展之后在去公司的车上,用手机编辑备忘录写下观展心得,然后到办公室后,切换为2in1设备,继续完成稿件的复杂处理,如插入图片,编辑文本格式等。这个特性最直观的价值就是可以自由地在多个设备之间流转,为用户带来无缝的体验。也为开发者带来更多的入口和流量。

4、多端协同:多端协同涉及的情况有并发、协作、互补。

(1)、多端协同-并发:主要就是镜像相同的内容到不同的显示屏幕。这里有几种情况:一种是使用窗口方式占用屏幕的一部分内容。一种是自适应布局展示。还有一种是全屏复制展示。全屏复制展示的实例:手机上播放的视频投到智慧屏上继续播放,这个特性的价值是专业的设备做专业的事。将音频、视频投播到其他设备上。给用户带来更好的感官体验。

(2)、多端协同-协作:指运行在多个物理设备上的软件彼此协作完成一项任务,通过充分发挥每种设备的优势能力,比如智慧屏的显示能力,手机输入输出能力等。为用户提供更好的体验。剪切板使用非常频繁,将复制粘贴这个动作扩展到了多设备上。在一个设备上复制,可以直接在其他设备上粘贴,复用本机的人机交互,实现数据、文件的跨设备转移。

(3)、多端协同-互补:通过延展或者遥控来充分发挥每种设备的优势能力。如手机的拍照能力,手写板的输入能力等。如跨端拍照场景,用户在2in1设备中拍照不方便,可以在本端应用界面操作,唤醒手机设备的相机来拍摄所需的素材。拍摄的照片会快速地回传到2in1设备中,来帮助丰富自己的文档。

二、自由流转应用开发的挑战
1、连接步骤、数据互通、交互协同遇到困难:挑战1是连接复杂,近场设备之间的互联互通挑战,相比计算总线是硬件总线,能力是确定并且稳定的,而近场通信是无线连接,其质量依赖无线通信能力,带宽受限,易受干扰。不同的终端蓝牙、Wi-Fi、芯片不同,不同厂商的芯片、驱动、协议版本不同,环境差异对通信的影响不同,如:蓝牙是直线传播好,空阔的客厅传播好,而拥挤的厨房和阳台则传播不好。芯片、协议、环境、兼容性等不可控的因素下,如何通过软件定义通信,保证近场设备的互联互通是核心的挑战。其次数据难以互通,如何从设备A访问设备B的数据,多设备协同操作时,如何知道数据在哪台设备的哪个应用上,还有不同的设备类型意味着不同的传感能力、硬件能力、屏幕尺寸。还有设备的硬件能力差异。如小设备没有摄像头、NFC等。设备间的能力导致难以协同。

2、挑战2:基于传统操作系统开发跨设备交互的应用程序时,需要开发者自行解决设备发现、设备认证、设备连接、数据同步等技术难题,还要考虑不同的设备是否支持某些硬件能力,不但开发成本高,还存在安全隐私、兼容性、性能等诸多问题。

三、自由流转应用开发框架

1、单机应用开发模型:依赖应用之间互相通信去完成发现、连接、传输与数据的互通,而这一部分工作往往是需要开发者去考虑的。
2、HarmonyOS中的应用开发模型,为开发者提供了基础的分布式框架能力,下图列出了主要的几个部分:
(1)、分布式软总线:解决多设备发现、连接、组网痛点。
(2)、分布式数据:提供跨设备数据访问能力。
(3)、分布式硬件:提供跨设备硬件共享访问能力。
(4)、分布式任务调度:提供应用跨端迁移、多端协同能力。
依靠这些关键部分,让各类智能设备构成一个超级终端设备。将复杂的发现、连接、传输、安全等都交给系统。对于上层应用只需要简单的配置接口调用,就能进行多设备间的数据交互。

 3、分布式软总线技术架构:分布式软总线通过协议货架和软硬协同,屏蔽各种设备的协议差别,提供高吞吐、低时延、高可靠、安全可信的通信通道。克服无线通信不可靠、不稳定的挑战。为开发者提供接近本地化访问效果的通信能力。总线中枢模块负责解析命令完成设备间发现和连接,通过任务和数据两条总线,实现设备间文件传输、消息传输等功能。分布式软总线从逻辑架构上分为四大组成部分:(1)、发现:(2)、连接(3)、组网(4)、传输。四大模块,在整个软总线业务逻辑中分工合作,通过构筑分布式通信框架,达成多设备互联互通的目标。

4、分布式软总线核心技术:主要是自动发现和异构网络组网。

(1)、自动发现设备:是指实现用户零等待的自发现体验,可信设备自动发现无需等待,自动安全连接,无需任何用户操作。

(2)、异构网络组网:可以很好解决设备间不同协议如何交互的问题,蓝牙和Wi-Fi混合组网,自动构建一个逻辑全连接网络,解决设备间不同协议交互的问题。

5、分布式数据管理:解决跨端数据共享的问题。基于分布式软总线的能力,实现应用程序数据和用户数据的分布式管理。用户数据不再与单一的物理设备绑定,业务逻辑和数据存储分离,跨设备的数据处理如同本地数据处理一样方便快捷。让开发者能够轻松实现全场景多设备下的数据存储、共享和访问。

6、分布式数据管理:核心技术包括分布式数据库和分布式数据对象。根据跨设备同步数据生命周期的不同,可以分为持久数据生命周期比较长,需要保存到存储到数据库中,根据数据关系和特点,可以选择关系型数据库或者键值型数据库,临时数据生命周期比较短,通常保存在内存中,比如游戏应用产生的过程数据,建议使用分布式数据对象。

7、分布式硬件:解决跨端硬件共享问题。在传统操作系统中,设备之间互相独立,单设备虽然硬件外设资源丰富,但是归属于各个设备,应用层实现设备间硬件资源调用成本高,应用间能力难以复用。分布式硬件打破单一设备的硬件边界,能够将硬件设备化整为零,形成超级终端硬件资源池,供多个设备共享使用,真正达到软件定义硬件。设备间实现系统级融合并灵活按需适应不同场景的目的。对于开发者而言,只需要一套API实现本地和跨设备硬件查询调用。应用可以更加专注于业务创新,而无需关注底层细节。

8、分布式任务调度:基于分布式软总线、包管理、设备管理等技术特性。提供应用跨端迁移、多端协同的能力。分布式任务调度的核心能力包括:场景感知、迁移调度、协同调度、数据迁移。

(1)、场景感知:综合感知、空间、身份、设备等信息,为服务随人走提供决策基础。

(2)、迁移调度:提供跨设备迁移通知、原生迁移框架,帮助开发者快速开发迁移应用。

(3)、协同调度:提供跨设备拉起、绑定的主动能力,系统自行协同能力,管理协同关系,帮助开发者快速构建应用协同业务。

(4)、数据迁移:提供框架化的数据迁移传输接口,支持应用按需使用接口传输数据。

9、系统抽象和交互逻辑。

结合上述介绍的分布式应用开发框架设计的关键核心技术,进行简单的系统抽象。分布式软总线作为HarmonyOS系统的互联底座,提供快速发现、无感连接、稳定组网、极速传输这些关键技术。基于分布式软总线实现数据的分布式管理,让数据为多个设备共建共享。分布式硬件让硬件资源池化,完成多设备的硬件资源的共享,各个设备被分布式系统统一起来成为一个超级终端。上层应用只需简单的开发就能完成多设备的迁移和协同。

由此对于开发者而言,更关注自由流转具体的应用开发框架。

(1)、跨端迁移:开发者需要完成UIAbility、界面与对应的状态数据,包括UI界面、数据对象、文件等应用数据。从源端迁移到对端。

(2)、多端协同:开发者需要关注UIAbility间的异步消息通道,以及通过分布式共享对象去完成各个设备正在协同的UIAbility间的数据实时共享。

四、自由流转应用开发
以跨端迁移的应用开发示例进行讲解。多端协同的部分可以参考对应的指南。
1、以跨端迁移的运作机制:有两个设备A和设备B,分别为源端,也就是用户当前使用的设备,对端也就是当前任务迁移后使用的设备端。
(1)、首先在源端,通过UIAbility中的onContinue回调,开发者可以保存待接续的业务数据,例如:在浏览器应用中完成跨端迁移,开发者只需要使用onContinue回调,保存页面URL等业务内容,而系统将自动保存页面状态,如当前浏览进度,
(2)、分布式框架提供了跨设备应用界面:页面栈,以及业务数据等保存和恢复机制,它负责将数据从源端发送到对端,最后在对端同一UIAbility,可以通过onCreate/onNewWant接口来恢复业务数据,接续时会用到的主要接口,也就是onContinue和onCreate/onNewWant。

 2、开发步骤一:为应用配置基础迁移能力。

(1)、首先需要为应用配置基础的迁移功能,在entry/src/main/module.json5配置文件中配置continuable标签,continuable : true表示支持迁移,false表示不支持,默认为false。配置为false,将被系统识别为无法迁移。

(2)、指定启动模式,跨端迁移为单实例模式与多实例模式提供了不同的迁移接口,因此需要为应用配置启动模式,如果需要使用单实例启动模式,将配置文件中的abilities下的launchType标签配置为singlenton,配置为单实例模式。冷启动场景使用onCreate实现,热启动场景使用onNewWant实现。

(3)、为允许不同设备间的数据交换,应用需要配置分布式数据同步的权限,在requestPermissions下增加对应的权限声明ohos.permission.DISTRIBUTED_DATASYNC,因为分布式数据同步权限的权限类型为user_grant,该类型权限不仅需要在应用中申请权限,还需要在应用动态运行时,通过发送弹窗的方式请求用户授权,在用户主动授权后,应用才会真正获得对应的权限。

3、开发步骤二:应用动态运行时申请用户授权。

下面这个例子,在onCreate中申请用户授权。首选检查授权状态,如果未获得授权,就以弹窗的方式向用户申请权限。

4、开发步骤三:实现简单的接口

在源端onContinue函数中可以进行兼容性检验,根据检验结果返回迁移结果,这里为了让开发者快速入门,直接返回同意迁移。然后在对端接口的onCreate函数中触发页面恢复,

5、编码效果展示:

双端设备都已经设置好了基本的前提条件,并安装好了案例应用。

接着打开手机端的应用,此时平板端Dock栏,即右下角应用出现了对应的接续图标。

再切换到平板设备,打开应用,会发现手机端应用退出。

6、分布式数据传输。

上面已经完成了迁移应用开发框架,下面介绍如何迁移。

应用迁移的开发关键是数据迁移,在进行应用迁移开发设计的时候,需要先分析业务数据模型,采用合适的数据同步能力,达到最佳的体验。应用数据主要包括:

(1)、页面数据:优先使用分布式任务调度迁移框架进行迁移。如:通过支持迁移的组件进行数据迁移,通过配置项设置进行页面栈迁移。

(2)、业务数据:根据业务数据模型采用合适的数据同步能力。如:通过want参数传递应用数据状态,通过分布式数据对象迁移内存数据,通过分布式文件迁移文件数据。以邮件流转案例进行分析:应用迁移状态适合使用want参数传输,收件人、发件人、主体和邮件内容,这些数据适合使用分布式数据对象,而邮件内容适合使用分布式文件来迁移。

7、对分布式数据迁移的场景逐一介绍。

(1)、场景一:使用组件迁移数据。这种场景适用于使用了支持自动迁移的组件。如:List、Grid、Scroll、WaterFlow,并且希望这个组件的数据能够在多设备间保持一致,具体的开发方式就是给自动迁移的组件设置restoreId。传入一个number类的数字,不同的组件需要配置不同的restoreId,这样就能完成自动迁移。

(2)、场景二:页面栈迁移。系统默认迁移页面栈,如果不希望迁移页面栈,可以设置为false,无论是否需要迁移页面栈,在对端端onCreate函数中,只要是迁移的场景就要主动触发页面恢复。

(3)、场景三:少量状态数据迁移。一般是小于100KB的状态数据,例如分布式邮件中有一个sessionId的数据,用于传输内存数据时使用,多个设备间的对象,设置为同一个sessionId才能自动同步数据。首先需要实现源端onContinue接口中保存迁移数据,开发者可以将要迁移的数据通过键值对的方式保存在want参数中,在对端onCreate端时候,判断是否迁移场景,如果是迁移,进行迁移数据恢复,这样就完成了少量状态数据的迁移。

(4)、场景四:内存数据迁移。这种场景适用于临时数据,生命周期较短,通常保存在内存数据中,可以封装成一个对象,使用分布式数据对象的方式进行迁移。 

场景四-步骤1:创建分布式数据对象。在该场景中,需要在onWindowStageCreate的时候,创建一个分布式数据对象。

场景四-步骤2:向分布式数据对象写。在onContinue回调中设置sessionId,当可信组网中有多个设备时,多个设备间的对象如果设置为同一个sessionId就能自动同步。然后将数据保存到分布式对象中。对象数据保存成功后,当应用存在时不会释放数据,当应用退出后重新进入应用时恢复,这里需要注意的是,数据保存完之后,必须要调用save触发对象同步。下图最后还有一个上文讲到的,通过want的参数传递sectionId的例子。

场景四-步骤3:从分布式数据对象读。在onCreate回调中,先拿到传递过来的sessionId,然后对分布式数据对象的变化进行监听,具体的changeCall函数实现可以参考本文最后的示例。然后与拿到的sessionId绑定,最后从分布式数据对象中恢复数据。

(5)、场景五:使用分布式文件传输数据。当进行应用继续开发时,传输的文件大小超过了100KB,这个时候就需要使用分布式文件系统来进行迁移。分布式文件系统为应用提供了跨设备文件访问的能力,多个设备安装了同一个应用时,通过基础文件接口,可跨设备读写其他设备该应用分布式文件路径下的文件。如:多设备流转场景,设备组网互联之后,源端的应用可访问对端同应用分布式路径下的文件,当期望应用文件被其他设备访问时,只需要将文件移动到分布式文件路径即可。

场景五-步骤1:向分布式写文件。在源端将文件数据写入分布式文件路径,写完后关闭文件流。

场景五-步骤2: 从分布式文件读。在对端端分布式文件路径下,读取对应的文件数据,读取完毕后关闭文件流。

8、总结:

源码下载:DistributedMail.zip 

  

posted @ 2024-10-29 17:23  为敢技术  阅读(28)  评论(0编辑  收藏  举报