当前位置: 首页 > 科技观察

HarmonyOSJS分布式能力——学习笔记_0

时间:2023-03-12 05:45:54 科技观察

更多信息请访问:HarmonyOSJS社区https://harmonyos.51cto.com前言JS也有分布式能力。本文使用两个小项目来分享JS的分布式拉起和分布式迁移?(?*)正文这是在官网找到的分布式API在FA生命周期的位置图。其中onStartContinuation()、onSaveData(OBJECT)、onRestoreData(OBJECT)和onCompleteContinuation(code)是分布式能力接口项目相同的操作:1、安装配置DevEcoStudio2.1ReleaseDevEcoStudio2.1Release下载,DevEcoStudio2.1Release安装2。创建EmptyJavaPhone应用DevEcoStudio下载安装成功后,打开DevEcoStudio,点击左上角的File,点击New,然后选择NewProject,选择EmptyAbility(Java)选项,点击Next按钮。分布式拉起命名文件Distributrd1,分布式迁移命名文件Distributrd2(文件名不能出现中文或特殊字符,否则工程文件创建不成功),选择保存路径,选择API5,选择Phonetforthe设备,最后点击完成按钮。3、准备工作在entry>src>main>config.json文件底部的“launchType”:“standard”后面添加如下代码,这样应用上面的标签栏就可以去掉了。config.json中的部分代码:"name":"com.test.distributed1.MainAbility","icon":"$media:icon","description":"$string:mainability_description","label":"$string:entry_MainAbility","type":"page","launchType":"standard","metaData":{"customizeData":[{"name":"hwc-theme","value":"androidhwext:样式/主题.Emui.Light.NoTitleBar","extra":""}]}}],"js":[{"pages":["pages/index/index"],"name":"default","窗口":{"designWidth":720,"autoDesignWidth":true}}]}}4。添加权限在config.json中添加权限。"reqPermissions":[{"name":"ohos.permission.DISTRIBUTED_DATASYNC"}],在MainAbility.java中动态申请权限。publicclassMainAbilityextendsAceAbility{@OverridepublicvoidonStart(Intentintent){super.onStart(intent);//动态判断权限if(verifySelfPermission("ohos.permission.DISTRIBUTED_DATASYNC")!=IBundleManager.PERMISSION_GRANTED){//应用不授予权限if(canRequestPermission("ohos.permission.DISTRIBUTED_DATASYNC")){//是否可以申请弹窗授权(第一次申请或者用户没有选择禁止不再提示)requestPermissionsFromUser(newString[]{"ohos.permission.DISTRIBUTED_DATASYNC"},0);}}}@OverridepublicvoidonStop(){super.onStop();}}分布式上拉效果图1.实现界面布局在index.hml中编写如下代码。添加两个按钮组件,类选择器名称为btn,分别添加一个点击事件,按钮上的文字为“add1”和“pullup”。{{title}}加1pullup

在index.css中写入如下代码。添加一个类选择器btn,并修改其属性值。.container{flex-direction:column;justify-content:center;align-items:center;}.title{font-size:40px;color:#000000;opacity:0.9;}.btn{height:60px;width:100px;font-size:40px;background-color:aquamarine;margin:10px;}2.实现分布式上拉在index.js中编写如下代码。分布式上拉允许上拉本地或远程FA,上拉时可以传递参数。添加按钮点击事件distributed()通过FeatureAbility.startAbility(OBJECT)方法拉起FA,无回调结果,允许显式拉起远程或本地FA。其中,OBJECT是RequestParams类型的参数,包括需要的bundleName(要启动的包名,需要和abilityName配合使用,区分大小写),abilityName(能力名称)被启动,区分大小写)和可选的实体(希望调用的FA所属的实体列表。如果不填写,则默认搜索所有实体列表。需要与action结合使用),action(in不指定包名和能力名的情况下,可以根据Operation其他属性传入action值启动应用),deviceType(默认0:选择从本地和远程设备启动的FA。1:从本地设备启动FA,如果有多个FA满足条件,会弹出框让用户选择设备),data(指定要传递给对方的参数,其中需要序列化),标志(配置拉起FA时的uration开关,如是否避免安装等),url(拉起FA时,指定打开页面的url。默认是直接打开首页)。exportdefault{data:{title:"0"},onInit(){},distributed(){lettarget={bundleName:"com.test.distributed1",abilityName:"com.test.distributed1.MainAbility"};letresult=FeatureAbility.startAbility(目标);},}3。实现带数据传输的分布式上拉定义一个全局变量sum,初始化为0,添加一个按钮点击事件plus(),实现加1的功能。在FeatureAbility.startAbility(OBJECT)中添加一个参数data并实例化sum。因为data中设置的所有字段在对端FA中都可以直接在this下获取,所以在生命周期事件onInit()中通过this.number获取value。varsum=0;exportdefault{data:{title:"0"},onInit(){sum=this.number;this.title=sum;},distributed(){letactionData={number:sum};lettarget={bundleName:"com.test.distributed1",abilityName:"com.test.distributed1.MainAbility",data:actionData};letresult=FeatureAbility.startAbility(target);},plus(){sum++;this.title=sum;}}分布式迁移效果图1.实现界面布局创建一个空的JSPhone应用程序,命名为Distributed2。在index.hml中写入以下代码。添加两个按钮组件,类选择器名称为btn,分别添加一个点击事件,按钮上的文字为“add1”和“migrate”。{{title}}加1pullup
在index.css中写入如下代码。添加一个类选择器btn,并修改其属性值。.container{flex-direction:column;justify-content:center;align-items:center;}.title{font-size:40px;color:#000000;opacity:0.9;}.btn{height:60px;width:100px;font-size:40px;background-color:aquamarine;margin:10px;}2.实现分布式迁移在index.js中编写如下代码。分布式迁移提供主动迁移接口和一系列页面生命周期回调,支持本地服务无缝迁移到指定设备。添加按钮点击事件distributed(),通过FeatureAbility.continueAbility()方法主动进行FA迁移。其中,onStartContinuation()是FA发起迁移时的回调。在这个回调中,应用可以根据当前状态决定是否迁移。返回值为布尔型,true表示允许迁移,false表示不允许迁移。onSaveData(OBJECT)是保存状态数据的回调,开发者需要在参数对象中填写要迁移到目标设备的数据。参数是可以序列化的自定义数据。onRestoreData(OBJECT)是一个回调,用于恢复启动迁移时onSaveData方法保存的数据,用于恢复应用状态的对象,数据和结构由onSaveData决定。onCompleteContinuation(code)为迁移完成回调,在调用端触发,表示应用迁移到目标设备的结果。该参数是迁移完成的结果。0:成功,-1:失败。exportdefault{data:{title:"0"},onStartContinuation(){//判断当前状态是否适合迁移console.info("onStartContinuation被调用,适合迁移");returntrue;},onCompleteContinuation(code){//迁移操作完成,code返回结果if(code==0){console.info("onCompleteContinuation(code)被调用,迁移成功");}elseif(code==-1){console.info("onCompleteContinuation(code)被调用,迁移失败");}},onSaveData(saveData){//保存数据到savedData进行迁移。console.info("onSaveData(saveData)wascalled");},onRestoreData(restoreData){//接收迁移数据并恢复。console.info("onRestoreData(restoreData)iscalled");},distributed(){letresult=FeatureAbility.continueAbility();}}3.实现数据中转的分布式迁移定义一个序列化的continueAbilityData,其中编号为0。添加按钮点击事件plus()实现加1功能。在onSaveData(saveData)函数中,将序列化后的continueAbilityData保存到savedData中进行迁移。在onRestoreData(restoreData)函数中显示迁移后的数据。exportdefault{data:{title:"0",continueAbilityData:{number:0}},onStartContinuation(){//判断当前状态是否适合迁移console.info("onStartContinuation被调用,适合迁移");返回真;},onCompleteContinuation(code){//迁移操作完成,code返回结果if(code==0){console.info("onCompleteContinuation(code)被调用,迁移成功");}elseif(code==-1){console.info("onCompleteContinuation(code)wascalled,migrationfailed");}},onSaveData(saveData){//保存数据到savedData进行迁移。vardata=this.continueAbilityData;Object.assign(saveData,data)console.info("onSaveData(saveData)wascalled");},onRestoreData(restoreData){//接收迁移数据并恢复。this.continueAbilityData=restoreData;this.title=this.continueAbilityData.number;console.info("onRestoreData(restoreData)被调用");},distributed(){letresult=FeatureAbility.continueAbility();},plus(){this.continueAbilityData.number++;this.title=this.continueAbilityData.number;}}写在最后,本项目会长期更新。希望我们和关注这个项目的你,都能和鸿蒙一起成长,变得更强大。明年三月,深圳大学校园里的木棉花就要盛开。到时候,鸿蒙也会变得更好。希望这朵花,为你我绽放。文章相关附件可点击下方原文链接下载Distributed1.zipDistributed2.zip更多信息请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com