1个简单案例讲解:鸿蒙分布式任务调度

Answer 2021-08-17 16:28:57 4218

本文是对分布式任务调度的一个技术教程,以一个简单的案例来讲解。

正文部分分为两个部分:

第一部分是对分布式任务调度的简单概述

第二部分是分布式任务调度的一个简单案例(跨设备 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。

②申请权限

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

第一个权限是允许不同设备间的数据交换(敏感权限)。第二个权限是允许获取分布式组网内的设备列表和设备信息(非敏感权限)。应用在使用对应服务的能力或数据时,需要申请对应权限。

已在 config.json 文件中声明的非敏感权限,会在应用安装时自动授予,该类权限的授权方式为系统授权(system_grant)。

敏感权限需要应用动态申请,通过运行时发送弹窗的方式请求用户授权,该类权限的授权方式为用户授权(user_grant)。

在 entry>src>main>Java>MainAbility 文件里添加敏感权限(非敏感权限在该文件里可加可不加),在 onStart 函数里添加以下代码:

requestPermissionsFromUser(new String[]{"ohos.permission.DISTRIBUTED_DATASYNC"},0);

如果添加的权限比较多可以像这样新建一个字符串数组,后面的 0 是请求码(requestCode),是用来标识请求的来源(这个值任自己设定)。

③界面布局


在 entry>src>main>resources>base>layout>ability_main.xml 文件里添加一个按钮组件,加入唯一标识符 id 并配置好其他相应的属性,代码如下:

<Button
    ohos:height="match_content"
    ohos:width="match_parent"
    ohos:id="$+id:start"
    ohos:top_margin="100px"
    ohos:text="跨设备FA拉起"
    ohos:text_size="30fp"
    ohos:background_element="green"/>

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

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

④设置点击事件

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

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


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

通过上述步骤,你就能实现跨设备拉起它的主页面啦!如果想要拉起其他页面,可以对以下地方进行相应更改。

例如新建一个 Ability 文件和一个 Slilce 文件,然后在这个文件图二的位置作相应修改,然后修改图一的位置为这个新建的 Ability。


来源:快科技

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
Answer
红包 93 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
Answer
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区