
#星光计划1.0# HarmonyOS 流转之跨端迁移 原创 精华
作者:曾瑞绅
前言
流转在HarmonyOS中泛指多设备分布式操作,也是HarmonyOS的亮点之一。流转按体验可以分为跨端迁移和多端协同,这里主要跟大家讲一下如何进行跨端迁移,以及我在项目开发过程中,所遇到的问题与解决方法。
具体概念这里就不做过多的赘述了,大家可以查阅官方文档。
开发步骤
在开发过程中,我们可以根据业务需求分为以下两种场景:
- 同个FA之间的迁移(Ability1—Ability1);
- 不同FA之间的迁移(Ability1—Ability2);
下面给大家介绍一下以上两种场景的具体的开发步骤。
同个FA之间的迁移
同个FA之间的迁移是指不同设备端安装了同个FA,官方文档已经有比较详细的开发步骤,下面只给大家讲一下需要注意的事项及我所遇到的问题避免大家踩坑。
1.我们在创建完一个FA之后,因为我们大部门的业务逻辑都是在AbilitySlice,所以我们在Ability及AbilitySlice都要去实现IAbilityContinuation 接口,并且将Ability中实现的onStartContinuation()、onSaveData(IntentParams intentParams)、onRestoreData(IntentParams intentParams)的返回值,都设为true。
2.在对应的FA模块的config.json中,配置对应的权限,且在代码中也需要动态申请。
3.定义相关参数、设置流转任务管理服务回调函数、注册流转任务管理服务、管理流转的目标设备,同时需要在流转结束时解注册流转任务管理服务。
在Api5的时候IContinuationDeviceCallback的回调接口跟官方文档有些出入,当你选择设备后会在onDeviceConnectDone返回你所选择的设备ID及设备类型。
4.注册流转服务之后我们便可以调起系统流转选择设备弹窗,可以通过ExtraParams对设备进行过滤,如不需要过滤,可不传。
5.选择完设备之后会通过上述的IContinuationDeviceCallback的onDeviceConnectDone方法进行回调,之后通过continueAbility方法传入目标设备的DeviceID,将运行的FA迁移到目标设备,实现业务在设备间无缝迁移。
6.在FA迁移中我觉得最主要的部分就是状态和数据的传递,要让用户体验到”无缝“的用户体验,需要通过实现IAbilityContinuation接口来实现数据的传递,主要代码如下:
需要注意的是,在onRestoreData处理数据更新UI的时候,需要在UI线程中去更新,否则会报错。
不同FA之间的迁移
在实际开发中可能会因为设备端的部分需求、UI的不同,例如车机、手机、手表,从而开发了不同的FA。不同FA之间的迁移几乎与同个FA之间迁移配置一致,只是我们的AbilitySlice不需要再实现IAbilityContinuation接口来实现数据的同步,而是通过Intent,具体实现如下。
1.首先我们先在选择设备成功后的回调IContinuationDeviceCallback初始化分布式环境。
2.之前我们是通过continueAbility()方法进行跳转,而现在我们需要通过Intent方法进行跳转。
在接收方,我们可以通过onStart(Intent intent)方法接受传递过来的参数,再根据自己的业务逻辑实现数据同步。
自定义设备选择弹窗
在实际项目开发中我们也可以自定义流转弹窗样式,但并不推荐这种方式,经测试发现只有在两个设备通过蓝牙连接的时候才能获取到设备列表,只有在特定的场景,例如手机与车机、手机与手表在实际使用过程中我们基本上是会保持蓝牙连接的,通过这种方式实现流转会更稳定。但如果不能保持蓝牙实时连接的场景则不推荐。
1.官方API提供了DeviceManager.getDeviceList()来获取远端设备,具体代码如下。
2.获取到设备列表后,我们就可以自行实现页面了,在上述的showDeviceList()弹出设备列表的位置替换成自己的弹窗即可。
效果展示
结语
目前在DevEco Studio 2.1 Release以上版本已经支持跨端迁移的模拟器了,如果没有显示出来可以在Settings-DevEco Labs 勾选Enable Super Device。
以上过程是在实际开发过程中慢慢摸索得出,如有不对的地方,欢迎在评论区指出,共同探讨。
更多原创内容请关注:开鸿 HarmonyOS 学院
入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,共建鸿蒙生态,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。
