更多内容请访问:鸿蒙科技社区https://harmonyos.51cto.com与华为官方共建1、前言本帖为参赛者HDC2021总结Codelabs有趣的突破竞赛。本demo基于Codelabs中的Java电影卡片开发。增加了服务流功能的平行视野和知识点。我先说吧。挑战的要求如上所述。我24日才参加了Codelabs挑战赛。23日入住Harmony应用与服务开发教室听课。晚上听参加Codelabs挑战的朋友说挑战有点难。难点,尤其是平行视界功能,之前没接触过。23日,我的朋友们没有完成检查站。演唱会结束后,我们回到酒店,打开电脑学习。我首先浏览了Codelabs的平行视觉示例,然后按照朋友说的,先拿到一张电影服务卡片,然后点击卡片进入电影列表,点击电影列表中的一个项目,平行视界中会显示详情,就可以了在详情页转账。说到服务卡,大家都知道用JS写起来更快更简单。由于我们的目的是了解ParallelHorizo??ns,所以我们直接使用了Codelabs中的JS电影卡片。我们想添加平行视野。平行视界样本看了N遍,修改了很多次。JS片卡,到头来还是无法实现平行视界。已经是凌晨3点多了,我跟朋友说,看来今晚是搞不定了。会不会是地平线不支持JS能力,先睡觉吧。第二天去Codelabs挑战现场,问ParallelVision是否支持JS接口?我说不行,目前只支持Java。编写,先配置config.json文件,再添加easygo.json文件,配置左边显示哪个Ability,右边显示哪个Ability。下面简单介绍一下开发过程。2.实现B站视频效果:https://www.bilibili.com/video/BV1N34y1Z7Gj/3.工程搭建打开Codelabs网站找到Java电影卡,点击引用gitee下载此源码示例,如前所述,本示例是在Java电影卡的基础上,增加了平行视界和服务传递功能。下载完成后解压,打开DevEcoStudio开发工具,点击文件->打开,找到刚刚解压出来的MovieCardDemo电影卡片示例。4.新增及修改文件介绍先说项目简单支持平行视界,主要是两个配置文件:1.config.json配置支持平行视界,模块下添加:"metaData":{"customizeData":[{“名称”:“EasyGoClient”,“值”:“真”}]}2。添加easygo.json文件支持平行视界:{"easyGoVersion":"1.0","client":"com.army.study",//与config.json文件的bundleName一致"logicEntities":[{"head":{"function":"magicwindow","re??quired":"true"},"body":{"mode":"1","abilityPairs":[{"from":"com.huawei.cookbook.MainAbility",//显示在平行视界左侧"to":"com.huawei.cookbook.MoviesDetailAbility"//显示在平行视界页面右侧}],"UX":{"isDraggable":"true","supportRotationUxCompat":"true","supportDraggingToFullScreen":"ALL"}}}]}设备选择对话框DeviceDialog是Codelabsparallelhorizo??n代码的封装类。packagecom.huawei.cookbook;importcom.huawei.cookbook.slice.MoviesDetailAbilitySlice;importohos.aafwk.ability.continuation.*;importohos.app.Context;importohos.hiviewdfx.HiLog;importohos.hiviewdfx.HiLogLabel;publicclassDeviceDialog3,0xD001100,"chuangguan");//contextObjectprivatefinalContextcontext;//获取流转任务管理服务管理类privatefinalIContinuationRegisterManagercontinuationRegisterManager;//AbilitytokenreturnedafterthetransfertaskmanagementserviceisregisteredprivateintabilityToken;//DeviceIDreturnedafterauserselectsadeviceinthedevicelistprivateStringselectDeviceId;//设置流转任务管理服务设备状态变更的回调privatefinalIContinuationDeviceCallbackcallback=newIContinuationDeviceCallback(){@OverridepublicvoidonDeviceConnectDone(Stringstr,Stringstr1){//SetthedeviceIDaftertheuserselectsthedevicesselectDeviceId=str;continuationRegisterManager.updateConnectStatus(abilityToken,selectDeviceId,DeviceConnectState.CONNECTED.getState(),null);returnDeviceId();}@OverridepublicvoidonDeviceDisconnectDone(Stringstr){}};//设置注册转移任务管理服务回调privatefinalRequestCallbackrequestCallback=newRequestCallback(){@OverridepublicvoidonResult(intresult){abilityToken=result;}};/***初始化DeviceDialog,设置transfertaskmanagementservice管理类,*注册transfertaskmanagementservice管理类。**@paramcontinuationRegisterManagercontinuationRegisterManager*@paramsliceslice*@since2021-09-10*/publicDeviceDialog(IContinuationRegisterManagercontinuationRegisterManager,Contextslice){this.continuationRegisterManager/continuationRegisterManager;this.continuationRegisterManager/continuationRegisterRegisterManager(this.continuationRegisterManager/continuationRegisterRegisterManager));}//注册转移任务管理服务管理类privatevoidregisterManager(){//添加过滤条件ExtraParamsparams=newExtraParams();String[]devTypes=newString[]{ExtraParams.DEVICETYPE_SMART_PAD,ExtraParams.DEVICETYPE_SMART_PHONE};params.setDevType(devTypes);continuationRegisterManager.register(context.getBundleName(),参数,回调,requestCallback);}/***打开设备选择框**@since2021-09-10*/publicvoidshowDeviceList(){//设置过滤设备类型ExtraParamsparams=newExtraParams();String[]devTypes=newString[]{ExtraParams.DEVICETYPE_SMART_PAD,ExtraParams.DEVICETYPE_SMART_PHONE};params.setDevType(devTypes);//注册continuationRegisterManager.register(context.getBundleName(),params,callback,requestCallback);//显示选中的设备列表continuationRegisterManager.showDeviceList(abilityToken,params,无效的);}//returnthedeviceIDprivatevoidreturnDeviceId(){HiLog.info(LABEL_LOG,"deviceid::"+selectDeviceId);MoviesDetailAbilitySlice.setDeviceId(selectDeviceId);}/***断开传输任务管理服务**@since2021-09-10*/publicvoidclearRegisterManager(){//注销中转任务管理服务continuationRegisterManager.unregister(abilityToken,null);//断开中转任务管理服务连接continuationRegisterManager.disconnect();}}提示对话框Utilspublicclass:publicstaticvoidcreatToastDialog(Contextcontext,Stringmessage){Componentcomponent=LayoutScatter.getInstance(context).parse(ResourceTable.Layout_layout_toast,null,false);组件componentText=component.findComponentById(ResourceTable.Id_msg_toast);if(componentTextinstanceofText){((Text)componentText).setText(message);}newToastDialog(context).setComponent(component).setSize(DirectionalLayout.LayoutConfig.MATCH_CONTENT,DirectionalLayout.LayoutConfig.MATCH_CONTENT.)onStart(intent);super.setMainRoute(MoviesDetailAbilitySlice.class.getName());}@OverridepublicbooleanonStartContinuation(){returntrue;}@OverridepublicbooleanonSaveData(IntentParamsintentParams){returntrue;}@OverridepublicbooleanonRestoreData(IntentParamsintentParams){returntrue;}@Overridepublictintinuation(incompleteContiuation)){}}公开lassMoviesDetailAbilitySliceextendsAbilitySliceimplementsIAbilityContinuation{//此处省略原代码@OverridepublicbooleanonStartContinuation(){returntrue;}@OverridepublicbooleanonSaveData(IntentParamssaveData){saveData.setParam("remoteMovieId",movieId);returntrue;}@OverridepublicbooleanonRestoreData(IntentParamsrestoreId=this.movi??eparseLong(restoreData.getParam)("remoteMovieId").toString());returntrue;}@OverridepublicvoidonCompleteContinuation(inti){isCirculation=false;}}实现服务循环,首先在config.json中添加权限申请,模块:"reqPermissions":[{"name":"ohos.permission.DISTRIBUTED_DATASYNC","re??ason":"$string:entry_MoviesDetailAbility","usedScene":{"ability":["com.huawei.cookbook.MainAbility","com.huawei.cookbook.MoviesDetailAbility"],"when":"always"}},{"name":"ohos.permission.GET_DISTRIBUTED_DEVICE_INFO","re??ason":"$string:entry_MoviesDetailAbility","usedScene":{"ability":["com.huawei.cookbook.MainAbility","com.huawei.cookbook.MoviesDetailAbility"],"when":"always"}}]也在应用入口提供了显示权限申请:@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setMainRoute(MainAbilitySlice.class.getName());//声明跨端迁移访问权限requestPermissionsFromUser(newString[]{"ohos.permission.DISTRIBUTED_DATASYNC"},0);addActionRoute(ACTION_DETAIL,MoviesDetailAbilitySlice.class.getName());initData();initMyHandler();}介绍到此结束,是不是觉得我是个搬运工,在不同的Samples上合并综上所述,这个Demo确实是这样的,汇集了不同的知识点,形成了一个满足需求的应用,接下来我打算再写一个同样需求的应用,不过是从新建一个空白工程开始,展示列表、细节、服务卡、平行视界、服务流体验出来,大家有时间可以根据需要自己铺开!!!下图是当时HDC2021CodelabsBreakthroughCompetition的原图。更多信息请访问:鸿蒙与华为官方技术社区共建https://harmonyos.51cto.com
