HarmonyOS流转架构解析

内容纲要

核心概念

  • 跨端迁移:一种实现用户应用程序流转的技术方案,指在A端运行的FA迁移到B端上,完成迁移后,B端FA继续任务,而A端应用退出
  • 多端协同:一种实现用户应用程序流转的技术方案,指多端上的不同FA/PA同时运行或交替运行实现完整业务;或者,多端上的相同FA/PA同时运行实现完整业务。多个设备作为一个整体为用户提供比单设备更加高效、沉浸的体验

Ability的调度

  • 启动和关闭:向开发者提供管理远程Ability的能力,即支持启动Page模板的Ability,以及启动、关闭Service和Data模板的Ability
  • 连接和断开连接:向开发者提供跨设备控制服务的能力,开发者可以通过与远程服务连接和断开连接实现获取或注销跨设备管理服务的对象,达到和本地一致的服务调度
  • 迁移能力:向开发者提供跨设备业务的无缝迁移能力,开发者可以通过调用Page模板Ability的迁移接口,将本地业务无缝迁移到指定设备中,打通设备间壁垒

流转架构

核心模块

  • 流转任务管理服务:在流转发起端,接受应用程序注册,提供流转入口、状态显示、退出流转等管理能力
  • 分布式任务调度:提供远程服务启动、远程服务连接、远程迁移等能力,并通过不同能力组合,支撑应用程序完成跨端迁移或多端协同的业务体验
  • 分布式安全:提供端到端的加密通道,为用户程序提供安全的跨端传输机制,保证“正确的人,通过正确的设备,正确地使用数据”
  • 分布式软总线:使用基于手机、平板、智能穿戴、智慧屏等分布式设备的统一通信基座,为设备之间的互联互通提供统一的分布式通信能力

跨端迁移关键流程

  • 流转设备:设备A上的应用向流转任务管理服务注册一个流转回调
  • 流转开始:设备A上的应用通过调用分布式任务调度的能力,实现应用迁移
    • 系统回调设备A上FA的onStartContinuation()方法,确认当前FA是否可以开始迁移,onStartContinuation方法返回true,表示当前FA可以开始迁移
    • 若可以开始迁移,则系统回调设备A上FA的onSaveData()方法,以便保存迁移后恢复
    • 若保存数据成功,则系统在设备B上启动同一个FA,然后回调onRestoreData()方法,传递设备A上FA保存的数据,应用可在此方法恢复业务状态;此后设备B上此FA从onInit()开始其生命周期回调
    • 系统回调设备A上FA的onCompleteContinuation()方法,通知应用迁移成功。迁移操作完成,参数code返回结果

多端协同关键流程

  • 流转进行:设备A上的应用通过调用分布式任务调度的能力,如startAbility, connectAbility等,向设备B的应用发起多端协同
  • 协同开始
    • 设备A调用startAbility启动设备B的FA和PA
    • 设备A调用connectAbility连接设备B的PA:在设备A上通过本地应用提供的连接按钮,连接设备B上指定的PA。连接后,通过其他功能相关按钮实现控制对端PA的能力。通过连接关系,开发者可以实现跨设备的同步服务调度,实现如大型计算任务互助等价值场景
  • 协同结束
    • 设备A调用disconnectAbility断开与设备B的PA的连接
    • 设备A调用stopAbility关闭设备B的PA

约束与限制

  • 开发者需要在Intent中设置支持分布式的标记(如:Intent.FLAG_ABILITYSLICE_MULTI_DEVICE表示该应用支持分布式调度),否则无法获得分布式能力
  • 开发者通过在config.json中的reqPermissions字段里添加多设备协同访问的权限申请:三方应用使用{"name": "ohos.permissions.DISTRIBUTED_DATASYNC"}

分布式任务调度六种能力

连接远程PA

  • connectAbility(Intent intent, IAbilityConnection conn)接口提供连接指定设备上PA的能力,Intent中指定待连接PA的设备deviceId、bundleName和abilityName。当连接成功后,通过在conn定义的onAbilityConnectDone回调中获取对端PA的服务代理,两者的连接关系由conn维护。
参数名类型说明
intentohos.aafwk.content.Intent开发者需在intent对应的Operation中指定待连接PA的设备deviceId、bundleName和abilityName
connohos.aafwk.ability.IAbilityConnection当连接成功或失败时,作为连接关系的回调接口。该接口提供连接完成和断开连接完成时的处理逻辑,开发者可根据具体的场景进行定义

启动远程FA/PA

  • startAbility(Intent intent)接口提供启动指定设备上FA和PA的能力,Intent中指定待启动FA/PA的设备deviceId、bundleName和abilityName。
    • 分布式调度平台还会提供与上述功能相对应的断开远程PA的连接和关闭远程PA的接口,相关的参数与连接、启动的接口类似
    • 断开远程PA连接:disconnectAbility(IAbilityConnection conn)
    • 关闭远程PA:stopAbility(Intent intent)

迁移FA

  • continueAbility()接口提供将本地FA迁移到指定设备上的能力。需要实现IAbilityContinuation及其方法,才可以实现FA迁移。IAbilityContinuation的方法有:
    • onStartContinuation(): Page请求迁移后,系统首先回调此方法,开发者可以在此回调中决策当前是否可以执行迁移,比如,弹框让用户确认是否开始迁移
    • onSaveData(): 如果onStartContinuation()返回true,则系统回调此方法,开发者在此回调中保存必须传递到另外设备上以便恢复Page状态的数据

接口IAbilityContinuation的方法

  • onRestoreData(): 源测设备上Page完成保存数据后,系统在目标侧设备上回调此方法,开发者在此回调中接受用于恢复Page状态的数据。注意,在目标侧设备上的Page会重新启动其生命周期,无论其启动模式如何配置。且系统回调此方法的时机在onStart()之前。
  • onCompleteContinuation(): 目标侧设备上恢复数据一旦完成,系统就会在源侧设备上回调Page的此方法,以便通知应用迁移流程已结束。开发者可以在此检查迁移结果是否成功,并在此处理迁移结束的动作,如,应用可以在迁移完成后终止自身生命周期。

跨端迁移功能开发

  • 跨设备迁移支持将Page在同一用户的不同设备间迁移,以便支持用户无缝切换的诉求。以Page从设备A迁移到设备B为例,迁移动作主要步骤如下:
    1. 设备A上的Page请求迁移
    2. HarmonyOS处理迁移任务,并回调设备A上Page的保存数据方法,用于保存迁移必须的数据
    3. HarmonyOS在设备B上启动同一个Page,并回调其恢复数据方法

迁移示例代码

tryContinueAbility: async function()
{
    let result = await FeatureAbility.continueAbility();
    console.info("result." + JSON.stringify(result));
},
onStartContinuation()
{
    console.info("onStartContinuation");
    return true;
},
onCompleteContinuation(code)
{
    console.info("CompleteContinuation: code = " + code);
},
onSaveData(saveData)
{
    var data = this.continueAbilityData;
    Object.assign(saveData, data);
},
onRestoreData(restoreData)
{
    this.continueAbilityData = restoreData;
},

多端协同功能开发

  • 电视机遥控器

启动遥控器

  • 点击TV端主界面搜索框,会出现选择手机遥控器的弹框。用户选择需要的手机遥控设备,点击后会立刻拉起手机遥控输入界面。
    public void openRemoteAbility(String deviceId, String bundleName, String abilityName)
    {
    Intent intent = new Intent();
    intent.setParam("localDeviceId", localDeviceId);
    Operation operation = new Intent.OperationBuilder()
        .withDeviceId(deivceId)
        .withBundleName(abilityName)
        .withAbilityName(abilityName)
        .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
        .build();
    intent.setOperation(operation);
    abilitySlice.startAbility(intent);
    }

连接远程智慧屏

  • 遥控界面FA在启动过程中,通过initConnManager()方法,与TV端RemoteService建立连接。

留下评论

您的电子邮箱地址不会被公开。