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

    文章

    2642

    浏览量

    69337
  • HarmonyOS
    +关注

    关注

    80

    文章

    2146

    浏览量

    35569

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Taro on HarmonyOS 技术架构深度解析

    on HarmonyOS 的技术实现方案、核心优化策略,以及开源版本的主要特性。 本文将详细介绍 Taro on HarmonyOS 的技术架构、性能优化实践和开源进展,分享我们在
    的头像 发表于 08-04 16:10 564次阅读
    Taro on <b class='flag-5'>HarmonyOS</b> 技术架构深度解析

    HarmonyOS next】ArkUI-X休闲益智连连看【进阶】

    一套代码双运行的平台实践 在移动应用开发平台技术始终是开发者追求的圣杯。借助ArkUI-X框架,我们仅用一套ArkTS代码即可实现应用在H
    发表于 06-28 21:51

    HarmonyOS next】ArkUI-X休闲益智猜字谜【基础】

    下图是在iOS的运行效果 下图是在HarmonyOS的运行效果 今天咱们来聊聊如何用ArkUI-X这个新兴框架实现开发,通过一个猜字
    发表于 06-26 20:01

    ArkUI-X平台应用改造指南

    工作量大幅增加,开发成本也随之上升,而且很难保持一致的交互体验。 ArkUI-X 平台框架是基于 HarmonyOS 打造的平台框架
    发表于 06-16 23:05

    高压单探头设计的器材应如何选型

    在高压单探头设计的过程,器材的选型是尤为重要的,这决定探头的性能,可靠性和安全性等重要环节。从电气性能到机械结构,每一个器件的选型都要经过深思熟虑,本文主要从电气性能方面探讨,应该如何进行器材的选型。
    的头像 发表于 06-05 18:07 422次阅读

    请问STM32WBA65如何进行matter的学习?

    STM32WBA65如何进行matter的学习?相关的支持都有哪些?有一个X-CUBE-MATTER,可是这个没有集成在STM32CubeMX
    发表于 04-24 07:22

    AKI语言调用库神助攻C/C++代码迁移HarmonyOS NEXT

    本帖最后由 HarmonyOS开发者社区 于 2025-1-3 15:41 编辑 随着HarmonyOS NEXT的发布,越来越多的应用加速推进鸿蒙化。在这一过程,如何高效迁移
    发表于 01-02 17:08

    HarmonyOS Next 应用元服务开发-应用接续动态配置迁移快速启动目标应用

    快速启动目标应用,默认情况下,发起迁移后不会立即拉起对的目标应用,而是等待迁移数据从源传输到对后才会拉起应用。若应用希望在用户发起接续
    发表于 12-31 09:58

    HarmonyOS Next 应用元服务开发-应用接续动态配置迁移保持迁移连续性

    保证迁移连续性,由于迁移加载时,目标拉起的应用可能执行过自己的迁移状态设置命令(如:冷启动时目标在onCreate
    发表于 12-30 10:30

    HarmonyOS Next 应用元服务开发-应用接续动态配置迁移按需退出

    按需退出,支持应用动态选择迁移成功后是否退出迁移应用(默认迁移成功后退出迁移应用)。如果
    发表于 12-27 14:39

    HarmonyOS Next 应用元服务开发-应用接续动态配置迁移按需迁移页面

    。 如果应用使用navigation路由,可以设置不进行页面栈迁移,并将需要接续的页面(或页面栈)信息保存在want传递,然后在目标手动加载指定页面。应用在源
    发表于 12-26 15:23

    HarmonyOS Next 应用元服务开发-应用接续动态配置迁移

    支持同应用不同Ability迁移,一般情况下,迁移
    发表于 12-25 10:10

    HarmonyOS Next 应用元服务开发-分布式数据对象迁移数据文件资产迁移

    向用户申请授权。 二、基础数据迁移 使用分布式数据对象,与上述开发步骤类似,需要在源onContinue()接口中进行数据保存,并在对的onCreate()/onNewWant()
    发表于 12-24 10:11

    HarmonyOS Next 应用元服务开发-分布式数据对象迁移数据权限与基础数据

    向用户申请授权。 二、基础数据迁移 使用分布式数据对象,与上述开发步骤类似,需要在源onContinue()接口中进行数据保存,并在对的onCreate()/onNewWant()
    发表于 12-24 09:40

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

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