鸿蒙软总线,超详细教程来啦!

Answer 2021-08-16 18:26:14 5331

软总线是什么?分布式软总线是手机、平板、智能穿戴、智慧屏、车机等分布式设备的通信基座,为设备之间的互联互通提供了统一的分布式通信能力。

本篇讲到的知识点:

启动远程 FA(Feature Ability)

连接远程 PA(Particle Ability),发送控制命令&远端处理数据(场景 1:传递加法数据,远端计算后返回给客户端。场景 2:传递数据,远端 Service 接收后更新远端的 UI。)

FA 跨设备迁移(可回迁)

混合打包

其他奇怪的知识

技术要求和环境要求:
基本组件熟练使用,ServiceAbility,CommonEventManager(公共事件开发)

两台 HarmonyOS 2.0 的真机 或 DevEco Studio 2.2 Beta1(分布式模拟器的自动开启,可同时模拟运行两台设备,且自动组网)。

获取 DevEco Studio 2.2 Beta1:
https://developer.harmonyos.com/cn/develop/deveco-studio?utm_source=product&utm_medium=link&utm_campaign=DS&utm_content=2.1#download_beta

Service Ability:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-service-connecting-0000000000044469

公共事件开发指导:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-notification-fwk-common-event-0000000000029871

其他:
真机分布式通信要求:同一局域网内,登录相同华为账号,开启蓝牙(可行方案),这样在设定-超级终端中附近我的设备即可查看到另外一台设备。

分布式模拟器会自动组网,不需要手动做其他操作。(设定的超级终端中看不出来已经组网成功)

运行到真机上需要进行签名,模拟器则不需要。

代码下载

gitee HarmonySoftBus:

https://gitee.com/shmily_cl/HarmonySoftBus

github HarmonySoftBus:

https://github.com/cl18652469346/HarmonySoftBus

先看下效果:




代码结构

代码结构如上图:
adapter:DevicesListAdapter,用于向 ListContainer 控件中填充设备数据。

component:SelectDeviceDialog 封装了设备选择弹框。

proxy:定义了连接远程和调用远程 service(PA)的接口、实现类以及代理。

service:RemoteService 为被控制端 service,供手机端远程调用。

申请权限

在 entry\src\main\config.json 中申请以下 4 个权限:

ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE:用于允许监听分布式组网内的设备状态变化。

ohos.permission.GET_DISTRIBUTED_DEVICE_INFO:用于允许获取分布式组网内的设备列表和设备信息。

ohos.permission.GET_BUNDLE_INFO:用于查询其他应用的信息。

ohos.permission.DISTRIBUTED_DATASYNC:用于允许不同设备间的数据交换。

此外,还需要在实现 Ability 的代码中显式声明需要使用多设备协同访问的权限,示例代码如下:
图片

获取组网内在线的其他设备 DeviceInfo(Id&Name):

图片

获取自身设备的 Id:

图片

启动远程 FA:

图片

和普通画面的启动类似,withDeviceId("") 为本地画面跳转。

跨设备启动需要携带远程设备的 DeviceID,以及设置 "支持分布式调度系统中的多设备启动"Flag。

连接远程 PA,发送控制命令&远端处理数据

第一步:客户端创建远程连接代理类

代码如下:

public class MyRemoteProxy implements IRemoteBroker {
/**

  • 远端响应成功的标识
    */
    public static final int ERR_OK = 0;
    private static final String TAG = MyRemoteProxy.class.getSimpleName();
    private final IRemoteObject remote;
    public MyRemoteProxy(IRemoteObject remote) {
    this.remote = remote;
    }

    @Override
    public IRemoteObject asObject() {
    return remote;
    }

    // 携带数据向远端Sevice发送请求
    public int senDataToRemote(int requestType, Map paramMap) {
    MessageParcel data = MessageParcel.obtain();
    MessageParcel reply = MessageParcel.obtain();
    MessageOption option = new MessageOption(MessageOption.TF_SYNC);
    int ec = 1;
    int result = -1;
    try {
    if (paramMap.get("inputString") instanceof String) {
    String inputString = (String) paramMap.get("inputString");
    data.writeInt(requestType);
    data.writeString(inputString);
    remote.sendRequest(requestType, data, reply, option);
    }
    ec = reply.readInt();
    if (ec != ERR_OK) {
    LogUtils.error(TAG, "RemoteException:");
    } else {
    if (requestType == ConnectManagerIml.REQUEST_PLUS) {
    result = reply.readInt(); // 返回成功后拿到远端计算的结果。
    }
    }
    } catch (RemoteException e) {
    LogUtils.error(TAG, "RemoteException:");
    } finally {
    ec = ERR_OK;
    if (result != -1) {
    ec = result;
    }
    data.reclaim();
    reply.reclaim();
    }
    return ec;
    }
    }

①实现 IRemoteBroker 接口,asObject 返回远程 RemoteObject 对象。

②创建构造方法(参数为 connectAbility 成功时回调方法 onAbilityConnectDone 中的远程操作对象)。

③封装向远端发送请求的方法,便于后续进行控制(本例中是简单的加法请求)。

图片

MessageOption.TF_SYNC 代表同步,意味着会在 sendRequest 时阻塞等待来自远端 Service 的返回。

远端 Service 返回值是 reply,reply.readInt() 默认会返回 0,代表请求成功。若是想携带其他返回值,需要在远端 Service 中进行处理,下一步会讲到。

第二步:远端 Service 中,创建 RemoteObject 并处理请求

代码如下:

public class MyRemote extends RemoteObject implements IRemoteBroker {
private MyRemote() {
super("===MyService_Remote");
}
@Override
public IRemoteObject asObject() {
return this;
}
@Override
public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) {
LogUtils.info(TAG, "===onRemoteRequest......");
int requestType = data.readInt();
String inputString = "";
if (code == REQUEST_SEND_DATA) {
inputString = data.readString();
publishInput(requestType, inputString);
} else if (code == REQUEST_PLUS) {
int a = data.readInt();
int b = data.readInt();
reply.writeInt(ERR_OK);
reply.writeInt(a + b);
publishPlusResult(requestType, String.valueOf(a + b));
}
return true;
}
}
@Override
protected IRemoteObject onConnect(Intent intent) {
super.onConnect(intent);
return remote.asObject();
}

onRemoteRequest 接收来自 sendRequest(requestType,data,reply,option);传递过来的请求类型,数据,返回值,请求类型。

一般不需要处理 reply,客户端 reply.readInt() 也会拿到 0(表示请求成功),若是需要在远端接收到请求后,需要额外返回数据给客户端,则需要进行 write 操作。

第三步:连接远端 Service

代码如下图:

重点都标记了下,这块没啥好讲的,ServiceAbility 的基本连接操作。

第四步:发送命令,远端 Service 处理数据(返回数据、更新 UI)

场景 1:传递加法数据,远端计算后返回给客户端。

场景 2:传递数据,远端 Service 接收后更新远端的 UI。

远端 Service 在 onRemoteRequest 中处理更新 UI 的请求,远端利用公共事件,进行 UI 的更新。(意味着也就可以控制音乐的播放,暂停等等)

FA 跨设备迁移(可回迁)

跨端迁移开发指导:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/hop-cross-device-migration-guidelines-0000001146058939

目的:实现正在编辑的页面,流转的另外一台设备,利用分布式的能力提高用户的体验。

步骤一

想要迁移的 Ability 以及其下所有的 AbilitySlice 都必须需要实现一个接口:IAbilityContinuation。

坑点 1:哪怕你知识想将 Ability 其中一个 Slice 进行迁移,也必须将 Ability 的所有的 slice 都要实现该接口。

onStartContinuation FA 请求迁移后,系统首先回调此方法,开发者可以在此回调中决策当前是否可以执行迁移,比如,弹框让用户确认是否开始迁移。

onSaveData(IntentParams saveData)如果 onStartContinuation() 返回 true,则系统回调此方法,开发者在此回调中保存必须传递到目标端设备上,用于恢复 FA 状态的数据。

onRestoreData(IntentParams restoreData)发起端设备上 FA 完成保存数据后,系统在目标端设备上回调此方法,开发者在此回调中接受用于恢复 FA 状态的数据。

onCompleteContinuation(int result)目标端设备上恢复数据一旦完成,系统就会在发起端设备上回调 FA 的此方法,以便通知应用迁移流程已结束。

坑点 2:不要忘记 return true;Ability 中也要。

坑点 3:onRestoreData 进行 UI 的恢复时,需要切换到 UI 线程,否则...(没报错 Log)

步骤二

可回迁的迁移:

回迁(若是已经回迁了,再进行回迁,会报错。先 try-catch 了):

混合打包

目前鸿蒙上的应用有以下三种:
直接运行的安卓应用。

使用 DevEco Studio 编写的鸿蒙应用。

已有开发好的安卓应用,想拥有鸿蒙的一些特性,从而进行混合打包。apk 逻辑无需变化,即可拥有鸿蒙特性,例如服务卡片。

如何进行混合打包?篇幅原因,将会在另外一篇中详细介绍。请移步:安卓应用如何混合打包拥有鸿蒙的卡片服务?

https://developer.huawei.com/consumer/cn/blog/topic/03637432111020021

奇怪的知识

针对:分布式数据服务开发指导。

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/database-mdds-guidelines-0000001113961404

①设计字段

单版本分布式数据库的介绍比较简单。存储 key-value,value 若是复杂点没介绍。若想 value 中存储很多其他数据,可进行以下操作。

以上时创建单版本分布式数据库时,设置 Schema 对象,从而设计了数据库中的字段。

②数据存储

存入的时候,需要以 json 的格式进行写入。

③查询

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

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

举报反馈

举报类型

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

详细说明

审核成功

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

审核失败

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

小包子的红包

恭喜发财,大吉大利

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

    易百纳技术社区