0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HarmonyOS中如何进行跨端迁移

OpenHarmony技术社区 来源:鸿蒙技术社区 作者:曾瑞绅 2021-11-15 09:38 次阅读

流转在 HarmonyOS 中泛指多设备分布式操作,也是 HarmonyOS 的亮点之一。

流转按体验可以分为跨端迁移和多端协同,这里主要跟大家讲一下如何进行跨端迁移,以及我在项目开发过程中,所遇到的问题与解决方法。

具体概念这里就不做过多的赘述了,大家可以查阅官方文档:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/hop-overview-0000001092995092

开发步骤

在开发过程中,我们可以根据业务需求分为以下两种场景:

  • 同个 FA 之间的迁移(Ability1—Ability1)

  • 不同 FA 之间的迁移(Ability1—Ability2)

下面给大家介绍一下以上两种场景的具体的开发步骤。 ①同个 FA 之间的迁移

同个 FA 之间的迁移是指不同设备端安装了同个 FA,官方文档已经有比较详细的开发步骤,下面只给大家讲一下需要注意的事项及我所遇到的问题避免大家踩坑。

我们在创建完一个 FA 之后,因为我们大部门的业务逻辑都是在 AbilitySlice,所以我们在 Ability 及 AbilitySlice 都要去实现 IAbilityContinuation 接口

并且将 Ability 中实现的 onStartContinuation()、onSaveData(IntentParams intentParams)、onRestoreData(IntentParams intentParams)的返回值,都设为 true。

publicclassMainAbilityextendsAbilityimplementsIAbilityContinuation{

@Override
publicbooleanonStartContinuation(){
returntrue;
}

@Override
publicbooleanonSaveData(IntentParamsintentParams){
returntrue;
}

@Override
publicbooleanonRestoreData(IntentParamsintentParams){
returntrue;
}
//省略部分代码
...
}

在对应的 FA 模块的 config.json 中,配置对应的权限,且在代码中也需要动态申请。
"reqPermissions":[
{
"name":"ohos.permission.DISTRIBUTED_DATASYNC"},
{
"name":"ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE"},
{
"name":"ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"},
{
"name":"ohos.permission.GET_BUNDLE_INFO"}
]

if(canRequestPermission(SystemPermission.DISTRIBUTED_DATASYNC)){
//是否可以申请弹框授权(首次申请或者用户未选择禁止且不再提示)
requestPermissionsFromUser(
newString[]{SystemPermission.DISTRIBUTED_DATASYNC},PERMISSIONS_REQUEST_DISTRIBUTED);
}

定义相关参数、设置流转任务管理服务回调函数、注册流转任务管理服务、管理流转的目标设备,同时需要在流转结束时解注册流转任务管理服务。

//流转应用包名
privateStringBUNDLE_NAME="XXX.XXX.XXX";
//注册流转任务管理服务后返回的Abilitytoken
privateintabilityToken;
//用户在设备列表中选择设备后返回的设备ID
privateStringselectDeviceId;
//获取流转任务管理服务管理类
privateIContinuationRegisterManagercontinuationRegisterManager;
//设置流转任务管理服务设备状态变更的回调
privateIContinuationDeviceCallbackcontinuationDeviceCallback=newIContinuationDeviceCallback(){
@Override
publicvoidonDeviceConnectDone(StringdeviceId,StringdeviceType){
selectDeviceId=deviceId;
continuationRegisterManager.updateConnectStatus(abilityToken,selectDeviceId,DeviceConnectState.CONNECTING.getState(),null);
...
}

@Override
publicvoidonDeviceDisconnectDone(Strings){
getUITaskDispatcher().asyncDispatch(()->{
continuationRegisterManager.updateConnectStatus(abilityToken,selectDeviceId,DeviceConnectState.DIS_CONNECTING.getState(),null);
});
unRegisterContinuation();
}
};
//设置注册流转任务管理服务回调
privateRequestCallbackrequestCallback=newRequestCallback(){
@Override
publicvoidonResult(intresult){
abilityToken=result;
}
};
...

@Override
publicvoidonStart(Intentintent){
...
continuationRegisterManager=getContinuationRegisterManager();
}

@Override
publicvoidonStop(){
super.onStop();
//解注册流转任务管理服务
continuationRegisterManager.unregister(abilityToken,null);
//断开流转任务管理服务连接
continuationRegisterManager.disconnect();
}

在 Api5 的时候 IContinuationDeviceCallback 的回调接口跟官方文档有些出入,当你选择设备后会在 onDeviceConnectDone 返回你所选择的设备 ID 及设备类型。

注册流转服务之后我们便可以调起系统流转选择设备弹窗,可以通过 ExtraParams 对设备进行过滤,如不需要过滤,可不传。

ExtraParamsparams=newExtraParams();
String[]devTypes=newString[]{ExtraParams.DEVICETYPE_SMART_PHONE,ExtraParams.DEVICETYPE_SMART_WATCH,ExtraParams.DEVICETYPE_SMART_PAD};
params.setDevType(devTypes);
registerContinuation();
//显示选择设备列表
continuationRegisterManager.showDeviceList(abilityToken,params,newRequestCallback(){
@Override
publicvoidonResult(intresult){
}
});

选择完设备之后会通过上述的 IContinuationDeviceCallback 的 onDeviceConnectDone 方法进行回调。

之后通过 continueAbility 方法传入目标设备的 DeviceID,将运行的 FA 迁移到目标设备,实现业务在设备间无缝迁移。

//设置流转任务管理服务设备状态变更的回调
privateIContinuationDeviceCallbackcontinuationDeviceCallback=newIContinuationDeviceCallback(){
@Override
publicvoidonDeviceConnectDone(StringdeviceId,StringdeviceType){
selectDeviceId=deviceId;
getUITaskDispatcher().asyncDispatch(()->{
continuationRegisterManager.updateConnectStatus(abilityToken,selectDeviceId,DeviceConnectState.CONNECTING.getState(),null);
});
if(selectDeviceId!=null){
continueAbility(selectDeviceId);
}
...
}

@Override
publicvoidonDeviceDisconnectDone(Strings){
...
unRegisterContinuation();
}

};

在 FA 迁移中我觉得最主要的部分就是状态和数据的传递,要让用户体验到”无缝“的用户体验,需要通过实现 IAbilityContinuation 接口来实现数据的传递。

主要代码如下:

@Override
publicbooleanonSaveData(IntentParamssaveData){
//根据业务需求,在这里去设置需要传递的数据
saveData.setParam("continueParam",continueParam);
returntrue;
}
@Override
publicbooleanonRestoreData(IntentParamsrestoreData){
//远端FA迁移传来的状态数据,开发者可以按照自身业务对这些数据进行处理
Objectdata=restoreData.getParam("continueParam");
getUITaskDispatcher().asyncDispatch(()->{

});
returntrue;
}

需要注意的是,在 onRestoreData 处理数据更新 UI 的时候,需要在 UI 线程中去更新,否则会报错。 ②不同 FA 之间的迁移 在实际开发中可能会因为设备端的部分需求、UI 的不同,例如车机、手机、手表,从而开发了不同的 FA。

不同 FA 之间的迁移几乎与同个 FA 之间迁移配置一致,只是我们的 AbilitySlice 不需要再实现 IAbilityContinuation 接口来实现数据的同步,而是通过 Intent,具体实现如下。

首先我们先在选择设备成功后的回调 IContinuationDeviceCallback 初始化分布式环境。

//设置流转任务管理服务设备状态变更的回调
privateIContinuationDeviceCallbackcontinuationDeviceCallback=newIContinuationDeviceCallback(){
@Override
publicvoidonDeviceConnectDone(StringdeviceId,StringdeviceType){
selectDeviceId=deviceId;
//省略部分代码
...
try{
//初始化分布式环境
DeviceManager.initDistributedEnvironment(selectDeviceId,newIInitCallback(){
@Override
publicvoidonInitSuccess(Stringsuccess){

}

@Override
publicvoidonInitFailure(Stringfailure,intresult){
}
});
}catch(RemoteExceptione){
e.printStackTrace();
}
...
}
....
};

之前我们是通过 continueAbility() 方法进行跳转,而现在我们需要通过 Intent 方法进行跳转。

Intentintent=newIntent();
Operationoperation=newIntent.OperationBuilder()
.withDeviceId(deviceId)
.withBundleName(bundleName)
.withAbilityName(abilityName)
.withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
.build();
intent.setOperation(operation);
IntentParamsintentParams=newIntentParams();
//通过IntentParams传递参数
...
startAbility(intent);

在接收方,我们可以通过 onStart(Intent intent) 方法接受传递过来的参数,再根据自己的业务逻辑实现数据同步。 ③自定义设备选择弹窗 在实际项目开发中我们也可以自定义流转弹窗样式,但并不推荐这种方式,经测试发现只有在两个设备通过蓝牙连接的时候才能获取到设备列表,只有在特定的场景。

例如手机与车机、手机与手表在实际使用过程中我们基本上是会保持蓝牙连接的,通过这种方式实现流转会更稳定。但如果不能保持蓝牙实时连接的场景则不推荐。

官方 API提供了 DeviceManager.getDeviceList() 来获取远端设备,具体代码如下。

publicstaticListgetDeviceList(){
//调用DeviceManager的getDeviceList接口,通过FLAG_GET_ONLINE_DEVICE标记获得在线设备列表
ListonlineDevices=DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
//判断组网设备是否为空
if(onlineDevices==null){
LogUtil.e(TAG,"onlinedevicesisnull");
returnnewArrayList<>();
}
returnonlineDevices;
}

获取到设备列表后,我们就可以自行实现页面了,在上述的 showDeviceList() 弹出设备列表的位置替换成自己的弹窗即可。

结语

目前在 DevEco Studio 2.1 Release 以上版本已经支持跨端迁移的模拟器了。

如果没有显示出来可以在 Settings-DevEco Labs 勾选 Enable Super Device。

以上过程是在实际开发过程中慢慢摸索得出,如有不对的地方,欢迎在评论区指出,共同探讨(附下载)。
https://harmonyos.51cto.com/posts/9013

责任编辑:haq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 鸿蒙系统
    +关注

    关注

    183

    文章

    2634

    浏览量

    66308
  • HarmonyOS
    +关注

    关注

    79

    文章

    1974

    浏览量

    30147

原文标题:HarmonyOS流转,替你踩坑了!!!

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请问AFE5801的输出是如何进行差分到单的处理进FPGA的?

    1请问AFE5801的输出是如何进行差分到单的处理进FPGA的?我用的FPGA型号是CycloneIII跟设置pinplanner为LVDS_E_3R或者LVDS有关吗? 2再就是芯片
    发表于 12-23 08:31

    揭秘动态化框架在鸿蒙系统下的高性能解决方案

    作者:京东科技 胡大海 前言 动态化框架 (后文统称“ 动态化” ) 是一个由京东金融大前端团队全自主研发的,一份代码,可以在 HarmonyOS、 iOS、Android、Web四
    的头像 发表于 10-08 13:46 785次阅读
    揭秘动态化<b class='flag-5'>跨</b><b class='flag-5'>端</b>框架在鸿蒙系统下的高性能解决方案

    TINA何进行频谱分析?

    想问一下TINA何进行频谱分析,找了好久没怎么找到,可能设置不对,望指点,谢谢
    发表于 09-14 07:56

    何进行电源供应设计

    电子发烧友网站提供《如何进行电源供应设计.pdf》资料免费下载
    发表于 09-09 10:33 0次下载
    如<b class='flag-5'>何进行</b>电源供应设计

    何进行IP检测

    排查网络连接问题,并及时的防范潜在的网络攻击。 那么,如何进行 IP 地址检测呢?接下来我将进行图示哦~ 使用操作系统自带的工具 ① Windows 系统,按win+R,输入“ipconfig”命令。 ② Mac 系统
    的头像 发表于 07-26 14:09 535次阅读
    如<b class='flag-5'>何进行</b>IP检测

    求助,在IR615可以选用哪种vpn协议?如何进行配置?

    现有多台IR615路由器,希望将其配置为vpn客户,连接云服务器的vpn服务 工程师远程连接云服务器对IR615进行管理 在IR615可以选用哪种vpn协议?如
    发表于 07-25 07:53

    HarmonyOS NEXT Developer Beta1最新术语表

    Common Event Service,是HarmonyOS负责处理公共事件的订阅、发布和退订的系统服务。 Cross-device migration,
    发表于 06-27 16:16

    国产系统重要突破!深开鸿KaihongOS率先连接HarmonyOS Next,实现生态互联

    合作伙伴和OpenHarmony核心共建单位,其国产操作系统KaihongOS已经成功与HarmonyOSNext实现了生态的互联互通。作为基于OpenHarmon
    的头像 发表于 06-25 11:24 532次阅读
    国产系统重要突破!深开鸿KaihongOS率先连接<b class='flag-5'>HarmonyOS</b> Next,实现<b class='flag-5'>跨</b>生态互联

    鸿蒙开发:应用组件设备交互(流转)【迁移

    迁移的核心任务是将应用的当前状态(包括页面控件、状态变量等)无缝迁移到另一设备,从而在新设备上无缝接续应用体验。这意味着用户在一台设备上进行
    的头像 发表于 06-11 17:10 1237次阅读
    鸿蒙开发:应用组件<b class='flag-5'>跨</b>设备交互(流转)【<b class='flag-5'>跨</b><b class='flag-5'>端</b><b class='flag-5'>迁移</b>】

    鸿蒙ArkTS声明式开发:平台支持列表【分布式迁移标识】 通用属性

    组件的分布式迁移标识,指明了该组件在分布式迁移场景下可以将特定状态恢复到对设备。
    的头像 发表于 06-07 21:15 394次阅读

    STemWinGUI_NUM_LAYERS是如何进行宏定义的,其依据是什么?

    STemWinGUI_NUM_LAYERS 这个层数指什么,是如何进行宏定义的,其依据是什么?
    发表于 04-19 06:21

    何进行RF PA Ruggedness的测试和评估呢?

    关于PA ruggedness设计测试问题,先介绍一下原理,如何进行ruggedness的测试和评估。
    的头像 发表于 03-27 10:19 2381次阅读
    如<b class='flag-5'>何进行</b>RF PA Ruggedness的测试和评估呢?

    HarmonyOS开发技术全面分析

    套系统能力、适配多种终端形态的分布式理念,能够支持多种终端设备。 ⚫ 对消费者而言, HarmonyOS 能够将生活场景的各类终端进行能力整合,形成一个“ 超级虚拟终端 ” ,可以实现不同的终端设备之间
    发表于 02-21 16:31

    【JAVA UI】【HarmonyOS】【Demo】 鸿蒙如何进行 xml 解析

    【鸿蒙】鸿蒙如何进行数据解析 【问题描述】有时候我们从服务器获取是 xml 格式数据,我们需要将 xml 转化成 model 对象,该如何使用呢?下面举个例子说明一下,将分以下几步进行 1.准备条件
    的头像 发表于 02-19 15:59 566次阅读
    【JAVA UI】【<b class='flag-5'>HarmonyOS</b>】【Demo】 鸿蒙如<b class='flag-5'>何进行</b> xml 解析

    鸿蒙OS 设备迁移

    设备迁移(下文简称“迁移”)支持将 Page 在同一用户的不同设备间迁移,以便支持用户无缝切换的诉求。以 Page 从设备 A 迁移到设备
    的头像 发表于 01-31 15:47 1134次阅读