首页 / 行业
HarmonyOS中如何进行跨端迁移
2021-11-15 09:38:00
流转在 HarmonyOS 中泛指多设备分布式操作,也是 HarmonyOS 的亮点之一。
流转按体验可以分为跨端迁移和多端协同,这里主要跟大家讲一下如何进行跨端迁移,以及我在项目开发过程中,所遇到的问题与解决方法。
具体概念这里就不做过多的赘述了,大家可以查阅官方文档:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/hop-overview-0000001092995092
开发步骤
在开发过程中,我们可以根据业务需求分为以下两种场景:
同个 FA 之间的迁移(Ability1—Ability1)
不同 FA 之间的迁移(Ability1—Ability2)
并且将 Ability 中实现的 onStartContinuation()、onSaveData(IntentParams intentParams)、onRestoreData(IntentParams intentParams)的返回值,都设为 true。
publicclassMainAbilityextendsAbilityimplementsIAbilityContinuation{@OverridepublicbooleanonStartContinuation(){returntrue;}@OverridepublicbooleanonSaveData(IntentParamsintentParams){returntrue;}@OverridepublicbooleanonRestoreData(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";//注册流转任务管理服务后返回的AbilitytokenprivateintabilityToken;//用户在设备列表中选择设备后返回的设备IDprivateStringselectDeviceId;//获取流转任务管理服务管理类privateIContinuationRegisterManagercontinuationRegisterManager;//设置流转任务管理服务设备状态变更的回调privateIContinuationDeviceCallbackcontinuationDeviceCallback=newIContinuationDeviceCallback(){@OverridepublicvoidonDeviceConnectDone(StringdeviceId,StringdeviceType){selectDeviceId=deviceId;continuationRegisterManager.updateConnectStatus(abilityToken,selectDeviceId,DeviceConnectState.CONNECTING.getState(),null);...}@OverridepublicvoidonDeviceDisconnectDone(Strings){getUITaskDispatcher().asyncDispatch(()->{continuationRegisterManager.updateConnectStatus(abilityToken,selectDeviceId,DeviceConnectState.DIS_CONNECTING.getState(),null);});unRegisterContinuation();}};//设置注册流转任务管理服务回调privateRequestCallbackrequestCallback=newRequestCallback(){@OverridepublicvoidonResult(intresult){abilityToken=result;}};...@OverridepublicvoidonStart(Intentintent){...continuationRegisterManager=getContinuationRegisterManager();}@OverridepublicvoidonStop(){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(){@OverridepublicvoidonResult(intresult){}});
选择完设备之后会通过上述的 IContinuationDeviceCallback 的 onDeviceConnectDone 方法进行回调。之后通过 continueAbility 方法传入目标设备的 DeviceID,将运行的 FA 迁移到目标设备,实现业务在设备间无缝迁移。
//设置流转任务管理服务设备状态变更的回调privateIContinuationDeviceCallbackcontinuationDeviceCallback=newIContinuationDeviceCallback(){@OverridepublicvoidonDeviceConnectDone(StringdeviceId,StringdeviceType){selectDeviceId=deviceId;getUITaskDispatcher().asyncDispatch(()->{continuationRegisterManager.updateConnectStatus(abilityToken,selectDeviceId,DeviceConnectState.CONNECTING.getState(),null);});if(selectDeviceId!=null){continueAbility(selectDeviceId);}...}@OverridepublicvoidonDeviceDisconnectDone(Strings){...unRegisterContinuation();}};
在 FA 迁移中我觉得最主要的部分就是状态和数据的传递,要让用户体验到”无缝“的用户体验,需要通过实现 IAbilityContinuation 接口来实现数据的传递。主要代码如下:
@OverridepublicbooleanonSaveData(IntentParamssaveData){//根据业务需求,在这里去设置需要传递的数据saveData.setParam("continueParam",continueParam);returntrue;}@OverridepublicbooleanonRestoreData(IntentParamsrestoreData){//远端FA迁移传来的状态数据,开发者可以按照自身业务对这些数据进行处理Objectdata=restoreData.getParam("continueParam");getUITaskDispatcher().asyncDispatch(()->{});returntrue;}
需要注意的是,在 onRestoreData 处理数据更新 UI 的时候,需要在 UI 线程中去更新,否则会报错。②不同 FA 之间的迁移在实际开发中可能会因为设备端的部分需求、UI 的不同,例如车机、手机、手表,从而开发了不同的 FA。不同 FA 之间的迁移几乎与同个 FA 之间迁移配置一致,只是我们的 AbilitySlice 不需要再实现 IAbilityContinuation 接口来实现数据的同步,而是通过 Intent,具体实现如下。首先我们先在选择设备成功后的回调 IContinuationDeviceCallback 初始化分布式环境。
//设置流转任务管理服务设备状态变更的回调privateIContinuationDeviceCallbackcontinuationDeviceCallback=newIContinuationDeviceCallback(){@OverridepublicvoidonDeviceConnectDone(StringdeviceId,StringdeviceType){selectDeviceId=deviceId;//省略部分代码...try{//初始化分布式环境DeviceManager.initDistributedEnvironment(selectDeviceId,newIInitCallback(){@OverridepublicvoidonInitSuccess(Stringsuccess){}@OverridepublicvoidonInitFailure(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
最新内容
手机 |
相关内容
半导体主控技术:驱动自动驾驶革命的
半导体主控技术:驱动自动驾驶革命的引擎,自动驾驶,交通,自动驾驶系统,数据,车辆,自动,随着科技的不断进步,自动驾驶技术已经成为现实晶振在激光雷达系统中的作用
晶振在激光雷达系统中的作用,作用,系统,激光雷达,晶振,可靠性,选择,激光雷达(Lidar)是一种利用激光进行测距的技术,广泛应用于自动驾驶Arbe 4D成像雷达以高分辨率雷达技
Arbe 4D成像雷达以高分辨率雷达技术和先进处理技术消除“幽灵刹车”问题,刹车,成像,分辨率,系统,目标,数据,Arbe 4D成像雷达是一种浅析动力电池熔断器的基础知识及选
浅析动力电池熔断器的基础知识及选型,动力电池,时切,系统安全,作用,产品,系统,BA4558F-E2动力电池熔断器是用于保护动力电池系统安消除“间隙”:力敏传感器如何推动新
消除“间隙”:力敏传感器如何推动新颖的HMI设计,传感器,智能手机,交互,交互方式,操作,用户,随着科技的不断发展,人机交互界面(HMI)的设振弦传感器智能化:电子标签模块
振弦传感器智能化:电子标签模块,模块,传感器,操作,连接,安装,控制,mbrs360t3g振弦传感器是一种常用的测量设备,用于检测物体的振动。智能家居中的MEMS传感器
智能家居中的MEMS传感器,传感器,智能家居,控制,用户,温度传感器,系统,MEMS(微机电系统)传感器是智能家居中的关键技术之一。它们是一英飞凌推出XENSIV胎压传感器,满足智
英飞凌推出XENSIV胎压传感器,满足智能胎压监测系统的需求,智能,胎压传感器,推出,胎压监测系统,英飞凌,需求,英飞凌(Infineon)是一家全