HarmonyOSJS分布式能力—学习笔记

HarmonyOSJS分布式能力—学习笔记

作者:木棉花HOS 2021-08-30 18:36:33

开发

前端

分布式

OpenHarmony JS也是具有分布式能力的,本文就以两个小项目来分享JS的分布式拉起和分布式迁移♪(∇*),分布式拉起允许拉起一个本地或远程的FA,拉起时可以传递参数。

[[420496]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.IDC.NET

前言

JS也是具有分布式能力的,本文就以两个小项目来分享JS的分布式拉起和分布式迁移(∇*)

正文

这是从官网中找到的分布式API在FA生命周期中的位置图,图中的onStartContinuation()、onSaveData(OBJECT)、onRestoreData(OBJECT)和onCompleteContinuation(code)均为分布式能力接口

项目相同的操作:

1. 安装和配置DevEco Studio 2.1 Release

DevEco Studio 2.1 Release下载、DevEco Studio 2.1 Release安装

2. 创建一个Empty Java Phone应用

DevEco Studio下载安装成功后,打开DevEco Studio,点击左上角的File,点击New,再选择New Project,选择Empty Ability(Java)选项,点击Next按钮。

分布式拉起将文件命名为Distributrd1,分布式迁移将文件命名为Distributrd2(文件名不能出现中文或者特殊字符,否则将无法成功创建项目文件),选择保存路径,选择API5,设备勾选Phonet,最后点击Finish按钮。

3. 准备工作

在entry>src>main>config.json文件中最下方”launchType”: “standard”的后面添加以下代码,这样就可以实现去掉应用上方的标签栏了。

config.json部分代码:

  1. "name""com.test.distributed1.MainAbility"
  2.         "icon""$media:icon"
  3.         "description""$string:mainability_description"
  4.         "label""$string:entry_MainAbility"
  5.         "type""page"
  6.         "launchType""standard"
  7.         "metaData": { 
  8.           "customizeData": [ 
  9.             { 
  10.               "name""hwc-theme"
  11.               "value""androidhwext:style/Theme.Emui.Light.NoTitleBar"
  12.               "extra""" 
  13.             } 
  14.           ] 
  15.         } 
  16.       } 
  17.     ], 
  18.     "js": [ 
  19.       { 
  20.         "pages": [ 
  21.           "pages/index/index" 
  22.         ], 
  23.         "name""default"
  24.         "window": { 
  25.           "designWidth": 720, 
  26.           "autoDesignWidth"true 
  27.         } 
  28.       } 
  29.     ] 
  30.   } 

4. 添加权限

在config.json中添加权限。

  1. "reqPermissions": [ 
  2.     { 
  3.       "name""ohos.permission.DISTRIBUTED_DATASYNC" 
  4.     } 
  5.   ], 

 在MainAbility.java中动态申请权限。

  1. public class MainAbility extends AceAbility { 
  2.     @Override 
  3.     public void onStart(Intent intent) { 
  4.         super.onStart(intent); 
  5.  
  6.         // 动态判断权限 
  7.         if (verifySelfPermission("ohos.permission.DISTRIBUTED_DATASYNC") != IBundleManager.PERMISSION_GRANTED) { 
  8.             // 应用未被授予权限 
  9.             if (canRequestPermission("ohos.permission.DISTRIBUTED_DATASYNC")) { 
  10.                 // 是否可以申请弹框授权(首次申请或者用户未选择禁止且不再提示) 
  11.                 requestPermissionsFromUser(new String[]{"ohos.permission.DISTRIBUTED_DATASYNC"}, 0); 
  12.             } 
  13.         } 
  14.     } 
  15.  
  16.     @Override 
  17.     public void onStop() { 
  18.         super.onStop(); 
  19.     } 

分布式拉起

效果图

1. 实现界面布局

在index.hml中编写以下代码。

添加两个button组件,类选择器名均为btn,分别添加一个单击事件,按钮上的文本分别为“加1”和“拉起”。

  1. <div class="container"
  2.     <text class="title"
  3.         {{ title }} 
  4.     </text> 
  5.     <button class="btn" onclick="plus">加1</button> 
  6.     <button class="btn" onclick="distributed">拉起</button> 
  7. </div> 

在index.css中编写以下代码。

添加类选择器btn,并修改其属性值。

  1. .container { 
  2.     flex-direction: column
  3.     justify-content: center; 
  4.     align-items: center; 
  5.  
  6. .title { 
  7.     font-size: 40px; 
  8.     color: #000000; 
  9.     opacity: 0.9; 
  10.  
  11. .btn { 
  12.     height: 60px; 
  13.     width: 100px; 
  14.     font-size: 40px; 
  15.     background-color: aquamarine; 
  16.     margin: 10px; 

2. 实现分布式拉起

在index.js中编写以下代码。

分布式拉起允许拉起一个本地或远程的FA,拉起时可以传递参数。添加按钮点击事件distributed()通过FeatureAbility.startAbility(OBJECT)方法拉起一个FA,无回调结果,允许以显式的方式,拉起远程或本地的FA。

其中OBJECT为RequestParams类型的参数,包含必填的bundleName(要启动的包名。需和abilityName配合使用,区分大小写)、abilityName(要启动的ability名,区分大小写)和选填的entities(希望被调起的FA所归属的实体列表,如果不填,默认查找所有实体列表。需配合action使用)、action(在不指定包名及ability名的情况下,可以通过传入action值从而根据Operation的其他属性启动应用)、deviceType(默认0: 从本地以及远端设备中选择要启动的FA。1: 从本地设备启动FA。有多个FA满足条件的情况下,将弹框由用户选择设备)、data(指定要传递给对方的参数,需要可被序列化)、flag(拉起FA时的配置开关,如是否免安装等)、url(拉起FA时,指定打开的页面的url。默认直接打开首页)。

  1. export default { 
  2.     data: { 
  3.         title: "0" 
  4.     }, 
  5.     onInit() { 
  6.          
  7.     }, 
  8.     distributed(){ 
  9.         let target = { 
  10.             bundleName: "com.test.distributed1"
  11.             abilityName: "com.test.distributed1.MainAbility" 
  12.         }; 
  13.         let result = FeatureAbility.startAbility(target); 
  14.     }, 

3. 实现带数据传递的分布式拉起

定义一个全局变量sum,并初始化为0。添加一个按钮点击事件plus()实现加1功能。

在FeatureAbility.startAbility(OBJECT)中添加一个参数data并实例化sum。

因为所有在data中设置的字段,在对端FA中均可以直接在 this下拿到,所以在生命周期事件onInit()中通过this.number取得该值。

  1. var sum = 0; 
  2.  
  3. export default { 
  4.     data: { 
  5.         title: "0" 
  6.     }, 
  7.     onInit() { 
  8.         sum = this.number; 
  9.         this.title = sum
  10.     }, 
  11.     distributed(){ 
  12.         let actionData = { 
  13.             number: sum 
  14.         }; 
  15.         let target = { 
  16.             bundleName: "com.test.distributed1"
  17.             abilityName: "com.test.distributed1.MainAbility"
  18.             data: actionData 
  19.         }; 
  20.         let result = FeatureAbility.startAbility(target); 
  21.     }, 
  22.     plus(){ 
  23.         sum++; 
  24.         this.title = sum
  25.     } 

分布式迁移

效果图

1. 实现界面布局

创建一个名为Distributed2的Empty JS Phone空应用。

在index.hml中编写以下代码。

添加两个button组件,类选择器名均为btn,分别添加一个单击事件,按钮上的文本分别为“加1”和“迁移”。

  1. <div class="container"
  2.     <text class="title"
  3.         {{ title }} 
  4.     </text> 
  5.     <button class="btn" onclick="plus">加1</button> 
  6.     <button class="btn" onclick="distributed">拉起</button> 
  7. </div> 

在index.css中编写以下代码。

添加类选择器btn,并修改其属性值。

  1. .container { 
  2.     flex-direction: column
  3.     justify-content: center; 
  4.     align-items: center; 
  5.  
  6. .title { 
  7.     font-size: 40px; 
  8.     color: #000000; 
  9.     opacity: 0.9; 
  10.  
  11. .btn { 
  12.     height: 60px; 
  13.     width: 100px; 
  14.     font-size: 40px; 
  15.     background-color: aquamarine; 
  16.     margin: 10px; 

2. 实现分布式迁移

在index.js中编写以下代码。

分布式迁移提供了一个主动迁移接口及一系列页面生命周期回调,以支持将本地业务无缝迁移到指定设备中。添加按钮点击事件distributed()通过FeatureAbility.continueAbility()方法主动进行FA迁移的入口。

其中onStartContinuation()为FA发起迁移时的回调,在此回调中应用可以根据当前状态决定是否迁移。返回值为Boolean类型,true表示允许进行迁移,false表示不允许迁移。

onSaveData(OBJECT)为保存状态数据的回调,开发者需要往参数对象中填入需迁移到目标设备上的数据。参数为可被序列化的自定义数据。

onRestoreData(OBJECT)为恢复发起迁移时onSaveData方法保存的数据的回调,用于恢复应用状态的对象,其中的数据及结构由onSaveData决定。

onCompleteContinuation(code)为迁移完成的回调,在调用端被触发,表示应用迁移到目标设备上的结果。参数为迁移完成的结果。0:成功,-1:失败。

  1. export default { 
  2.     data: { 
  3.         title: "0" 
  4.     }, 
  5.     onStartContinuation() { // 判断当前的状态是不是适合迁移 
  6.         console.info("onStartContinuation被调用,适合迁移"); 
  7.         return true
  8.     }, 
  9.  
  10.     onCompleteContinuation(code) { // 迁移操作完成,code返回结果 
  11.         if(code == 0){ 
  12.             console.info("onCompleteContinuation(code)被调用,迁移成功"); 
  13.         } else if(code == -1){ 
  14.             console.info("onCompleteContinuation(code)被调用,迁移失败"); 
  15.         } 
  16.     }, 
  17.     onSaveData(saveData) { // 数据保存到savedData中进行迁移。 
  18.         console.info("onSaveData(saveData)被调用"); 
  19.     }, 
  20.     onRestoreData(restoreData) { // 收到迁移数据,恢复。 
  21.         console.info("onRestoreData(restoreData)被调用"); 
  22.     }, 
  23.     distributed(){ 
  24.         let result =  FeatureAbility.continueAbility(); 
  25.     } 

3. 实现带数据传递的分布式迁移

定义一个序列化continueAbilityData,其中的number为0。添加一个按钮点击事件plus()实现加1功能。

在onSaveData(saveData)函数中将序列化continueAbilityData保存到savedData中进行迁移。在onRestoreData(restoreData)函数中将迁移的数据显示出来。

  1. export default { 
  2.     data: { 
  3.         title: "0"
  4.         continueAbilityData: { 
  5.             number: 0 
  6.         } 
  7.     }, 
  8.     onStartContinuation() { // 判断当前的状态是不是适合迁移 
  9.         console.info("onStartContinuation被调用,适合迁移"); 
  10.         return true
  11.     }, 
  12.  
  13.     onCompleteContinuation(code) { // 迁移操作完成,code返回结果 
  14.         if(code == 0){ 
  15.             console.info("onCompleteContinuation(code)被调用,迁移成功"); 
  16.         } else if(code == -1){ 
  17.             console.info("onCompleteContinuation(code)被调用,迁移失败"); 
  18.         } 
  19.     }, 
  20.     onSaveData(saveData) { // 数据保存到savedData中进行迁移。 
  21.         var data = this.continueAbilityData; 
  22.         Object.assign(saveData, data) 
  23.         console.info("onSaveData(saveData)被调用"); 
  24.     }, 
  25.     onRestoreData(restoreData) { // 收到迁移数据,恢复。 
  26.         this.continueAbilityData = restoreData; 
  27.         this.title = this.continueAbilityData.number; 
  28.         console.info("onRestoreData(restoreData)被调用"); 
  29.     }, 
  30.     distributed(){ 
  31.         let result =  FeatureAbility.continueAbility(); 
  32.     }, 
  33.     plus(){ 
  34.         this.continueAbilityData.number++; 
  35.         this.title = this.continueAbilityData.number; 
  36.     } 

写在最后

本项目会长期更新 ,希望随着鸿蒙一同成长变强的既有我们,也有正在看着这个项目的你。明年3月,深大校园内的木棉花会盛开,那时,鸿蒙也会变的更好,愿这花开,有你我的一份。

文章相关附件可以点击下面的原文链接前往下载

Distributed1.zip

Distributed2.zip

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.IDC.NET

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/229234.html<

(0)
管理的头像管理
上一篇2025-04-18 16:25
下一篇 2025-04-18 16:27

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注