更多内容请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com什么是软总线?智能穿戴、智慧屏、车载等分布式设备的通信基础,为设备间的互联互通提供统一的分布式通信能力。本文涉及的知识点:启动远程FA(FeatureAbility)连接远程PA(ParticleAbility),发送控制命令&远程处理数据(场景一:传递加法数据,完成后返回给客户端远程计算场景二:传输数据,远程Service收到后更新远程UI。)FA跨设备迁移(可移回)混合打包其他奇葩知识,技术要求和环境要求:熟练使用基础组件,ServiceAbility,CommonEventManager(通用事件开发)两个装有HarmonyOS2.0或DevEcoStudio2.2Beta1的真机一台(自动启用分布式模拟器,可同时模拟两台设备,自动组网)。获取DevEcoStudio2.2Beta1Service能力公开活动开发指导分布式通信其他真机要求:在同一个局域网内,使用同一个华为账号登录,并开启蓝牙(可行方案),以便在设置中查看-超级终端另一个设备。分布式模拟器会自动组网,无需其他人工操作。(在超级终端设置中看不到网络已经成功建立)在真机上运行需要签名,在模拟器中不需要。代码下载giteeHarmonySoftBusgithubHarmonySoftBus先看效果代码结构适配器:DevicesListAdapter,用于向ListContainer控件填充设备数据。组件:SelectDeviceDialog封装设备选择弹出框代理:定义了连接远程和调用远程服务(PA)的接口、实现类和代理。service:RemoteService是被控端的服务,可以被移动端远程调用。申请权限在entry\src\main\config.json申请以下四个权限:ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE:用于允许在分布式网络中监控设备状态变化。ohos.permission.GET_DISTRIBUTED_DEVICE_INFO:用于允许获取分布式网络中的设备列表和设备信息。ohos.permission.GET_BUNDLE_INFO:用于查询其他应用的信息。ohos.permission.DISTRIBUTED_DATASYNC:用于允许不同设备之间的数据交换。另外,需要在实现Ability的代码中明确声明使用多设备协同接入的权限。示例代码如下:获取网络中其他在线设备的DeviceInfo(Id&Name)获取本设备的Id来启动远程FA和正常画面与启动类似,withDeviceId("")跳转到本地画面。跨设备启动需要携带远端设备的DeviceID,并设置“分布式调度系统支持多设备启动”Flag。连接远程PA,在远端发送控制命令&处理数据第一步:客户端创建远程连接代理类publicclassMyRemoteProxyimplementsIRemoteBroker{/***远程响应成功的标识符*/publicstaticfinalintERR_OK=0;privatestaticfinalStringTAG=MyRemoteProxy.class。getSimpleName();privatefinalIRemoteObjectremote;publicMyRemoteProxy(IRemoteObjectremote){this.remote=remote;}@OverridepublicIRemoteObjectasObject(){returnremote;}//向远程Sevice发送数据请求publicintsenDataToRemote(intrequestType,MapparamMap){MessageParceldata=MessageParcel;pessage=Parcel.obtain(包裹)MessageParcel.obtain();MessageOptionoption=newMessageOption(MessageOption.TF_SYNC);intec=1;intresult=-1;try{if(paramMap.get("inputString")instanceofString){StringinputString=(String)paramMap.get("inputString");data.writeInt(requestType);data.writeString(inputString);remote.sendRequest(requestType,data,reply,option);}ec=reply.readInt();if(ec!=ERR_OK){LogUtils.error(TAG,"RemoteException:");}else{if(requestType==ConnectManagerIml.REQUEST_PLUS){result=reply.readInt();//返回成功后获取远程计算的结果}}}catch(RemoteExceptione){LogUtils.error(TAG,"RemoteException:");}finally{ec=ERR_OK;if(result!=-1){ec=result;}data.reclaim();reply.reclaim();}returnec;}}实现IRemoteBroker接口,asObject返回远程RemoteObject对象创建方法(参数为回调方法onAbilityConnectDone中的远程当connectAbility成功时)操作对象)封装了向远端发送请求的方法,方便后续控制(本例为简单的添加请求)。MessageOption.TF_SYNC表示同步,意思是发送Request时会阻塞等待远程Service的返回。远程Service的返回值为reply,reply.readInt()默认会返回0,表示请求成功。如果要携带其他返回值,需要在远程Service中进行处理,这个在下一步会讲到。第二步:在远程Service中,创建一个RemoteObject并处理请求LogUtils.info(TAG,"===onRemoteRequest......");intrequestType=data.readInt();StringinputString="";if(code==REQUEST_SEND_DATA){inputString=data.readString();publishInput(requestType,inputString);}elseif(code==REQUEST_PLUS){inta=data.readInt();intb=data.readInt();reply.writeInt(ERR_OK);reply.writeInt(a+b);publishPlusResult(requestType,String.valueOf(a+b));}returntrue;}}@OverrideprotectedIRemoteObjectonConnect(Intentintent){super.onConnect(intent);returnremote.asObject();}onRemoteRequest接收来自sendRequest(requestType,data,reply,option);传递的请求类型、数据、返回值、请求类型。一般不需要处理reply,client的reply.readInt()也会得到0(表示请求成功)。如果远端接收到请求后需要向客户端返回额外的数据,则需要进行写操作。第三步:连接远程Service的关键点都标出来了。这里就不多说了,ServiceAbility的基本连接操作。第四步:发送命令,远程Service处理数据(返回数据,更新UI)场景一:传加数据,远程计算后返回给客户端场景二:传数据,远程Service收到后更新远程UI远程Service在onRemoteRequest中处理更新UI的请求,远程使用公共事件更新UI。(意思是你还可以控制音乐播放,暂停等)FAcross-devicemigration(returnable)跨设备迁移开发指导目的:实现正在编辑的页面,另一个设备进行传输,利用分布式能力提高用户体验。Step1.想要迁移的Ability及其下所有的AbilitySlices都必须实现一个接口:IAbilityContinuation坑点1:即使要迁移其中一个Ability切片,也必须为该Ability的所有切片实现该接口后onStartContinuationFA请求迁移,系统先回调该方法,开发者可以在该回调中决定是否可以迁移。例如,一个弹出框允许用户确认是否开始迁移。onSaveData(IntentParamssaveData)如果onStartContinuation()返回true,系统会回调该方法。在此回调中,开发人员保存了必须传递给目标设备以恢复FA状态的数据。onRestoreData(IntentParamsrestoreData)发起设备上的FA保存完数据后,系统在目标设备上回调该方法,开发者在该回调中接受用于恢复FA状态的数据。onCompleteContinuation(intresult)一旦目标设备上的数据恢复完成,系统会在发起设备上回调FA的这个方法,通知应用程序迁移过程已经结束。坑点2:别忘了返回true;也在能力上。坑点3:onRestoreData恢复UI时,需要切换到UI线程,否则……(无错误日志)步骤2可以重定位。迁移重定位(如果已经重定位,再重定位会报错。先try-catch(是)混合打包目前鸿蒙上有3种Android应用可以直接运行。鸿蒙DevEcoStudio编写的application已经开发出Android应用,如果想拥有鸿蒙的一些特性,可以进行混装,apk逻辑不需要改动,就可以拥有Harmony的特性,比如服务卡。如何进行混合打包?由于篇幅原因,将在另一篇文章中详细介绍。转载请移步:Android应用如何与鸿蒙卡服务混合打包?奇葩知识目标:分布式数据服务开发指导设计领域:引入一个单版本分布式数据库比较简单,存储key-value,value复杂就不介绍了,如果要在value中存储很多其他数据,可以这样操作。n上面创建一个单版本的分布式数据库,设置Schema对象来设计数据库中的字段。数据存储:保存时需要写成json格式。咨询:更多信息请访问:Harmonyos.51cto.com,与华为官方共建的鸿蒙技术社区
