【木棉花】:简单的分布式任务调度 - HarmonyOS技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

[文章]

【木棉花】:简单的分布式任务调度

本帖最后由 jf_16575311 于 2021-9-3 14:49 编辑

前言
我是深鸿会深圳大学木棉花组织的成员之一,木棉花组织是对鸿蒙学习的相关资源进行整合,由深圳大学学生团队负责,长期更新。此次是对实现分布式任务调度的一个分享,以一个简单的案例来讲解。(ง •_•)ง
概述
正文部分分为两个部分。O(∩_∩)O
第一部分是对分布式任务调度的简单概述,第二部分是分布式任务调度的一个简单案例(跨设备FA的拉起)
正文
分布式任务调度的简单概述
Ability可以分为 FA(Feature Ability)和 PA(Particle Ability)两种类型。
FA支持Page Ability
Page模板:FA唯一支持的模板,用于提供与用户交互的能力。一个Page实例可以包含一组相关页面,每个页面用一个AbilitySlice实例表示。
PA支持Service Ability和Data Ability
Service模板:用于提供后台运行任务的能力。
Data模板:用于对外部提供统一的数据访问抽象。
根据 Ability 模板及意图的不同,分布式任务调度向开发者提供以下六种能力:启动远程 FA、启动远程 PA、关闭远程 PA、连接远程 PA、断开连接远程 PA 和 FA 跨设备迁移。


实现“跨设备FA的拉起”创建项目
DevEco Studio下载安装成功后,打开DevEco Studio,点击左上角的File,点击New,再选择New Project,选择Empty Ability(Java),然后点击Next,给项目命名 distribute_FA ,选择设备类型Phone,最后点击Finish。

申请权限
1.在entry>src>main>config.json文件中最下方"launchType": "standard"后面的中括号后 且 在上方的"module"的花括号内 添加以下代码,以添加所需要的分布式权限
  1. "reqPermissions": [
  2.       {
  3.         "name": "ohos.permission.DISTRIBUTED_DATASYNC"
  4.       },
  5.       {
  6.         "name": "ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"
  7.       }
  8.     ]

第一个权限是允许不同设备间的数据交换(敏感权限)。第二个权限是允许获取分布式组网内的设备列表和设备信息(非敏感权限)。应用在使用对应服务的能力或数据时,需要申请对应权限。
已在config.json文件中声明的非敏感权限,会在应用安装时自动授予,该类权限的授权方式为系统授权(system_grant)。
敏感权限需要应用动态申请,通过运行时发送弹窗的方式请求用户授权,该类权限的授权方式为用户授权(user_grant)。

2.在entry>src>main>Java>MainAbility文件里添加敏感权限(非敏感权限在该文件里可加可不加),在onStart函数里添加以下代码
  1. requestPermissionsFromUser(new String[]{"ohos.permission.DISTRIBUTED_DATASYNC"},0);

如果添加的权限比较多可以像这样新建一个字符串数组,后面的0是请求码(requestCode),是用来标识请求的来源(这个值任自己设定)
界面布局
entry>src>main>resources>base>layout>ability_main.xml 文件里添加一个按钮组件,加入唯一标识符id并配置好其他相应的属性,代码如下
  1.    
  2.         ohos:height="match_content"
  3.         ohos:width="match_parent"
  4.         ohos:id="$+id:start"
  5.         ohos:top_margin="100px"
  6.         ohos:text="跨设备FA拉起"
  7.         ohos:text_size="30fp"
  8.         ohos:background_element="green"/>


为了方便+好看,我把上方文本组件的 id 跟 text 改了一下

  1.      ohos:id="$+id:text"     
  2. ohos:text="分布式任务调度"

设置点击事件
1.在entry>src>main>Java>slice>MainAbilitySlice 文件里的 onStart下方定义一个函数来设置按钮的点击事件:①获取分布式组网内的设备列表和设备信息(其中,FLAG_GET_ONLINE_DEVICE是获取在线设备,可以根据需要选择离线OFFLINE或者全部设备ALL);②get(0)是指列表devicelist第一个元素;③operation是用来封装与intent相关的参数和操作,这里涉及的是AbilityName、BundleName、DevicedId、Flags
  1. private void run_start(){
  2.         Button start=(Button)findComponentById(ResourceTable.Id_start);
  3.         start.setClickedListener(new Component.ClickedListener() {
  4.             @Override
  5.             public void onClick(Component component) {
  6.                 List deviceList= DeviceManager.getDeviceList(ohos.distributedschedule.interwork.DeviceInfo.FLAG_GET_ONLINE_DEVICE);
  7.                 deviceId = deviceList.get(0).getDeviceId();
  8.                 Intent intent=new Intent();
  9.                 Operation operation = new Intent.OperationBuilder()
  10.                         .withAbilityName(MainAbility.class.getName())
  11.                         .withBundleName(getBundleName())
  12.                         .withDeviceId(deviceId)
  13.                         .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE).build();
  14.                 intent.setOperation(operation);
  15.                 startAbility(intent);
  16.             }
  17.         });
  18.     }



输入时注意以下几个点,不要选错了;如果有标红,移到上面看看是不是引入包加错了

2.在onStart里调用上面的点击函数run_start(),别忘了要定义变量deviceId


通过上述步骤,你就能实现跨设备拉起它的主页面啦!如果想要拉起其他页面,可以对以下地方进行相应更改(例如新建一个Ability文件和一个Slilce文件,然后在这个文件图二的位置作相应修改,然后修改图一的位置为这个新建的Ability)
结语
O(∩_∩)O 以上就是我这次的小分享啦。
更多资料收纳在我们组织的项目 :Awesome-Harmony_木棉花

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



回帖(1)

敷衍作笑谈

2021-9-3 16:48:37
非常棒的教程,感谢分享

更多回帖

×
发帖