【鸿蒙实战开发】 HarmonyOS软总线的简单使用

59 篇文章 0 订阅
53 篇文章 0 订阅

软总线是什么?

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

本篇讲到的知识点:

●启动远程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

Service Ability

公共事件开发指导

其他

●真机分布式通信要求:同一局域网内,登录相同华为账号,开启蓝牙 (可行方案),这样在 设定-超级终端 中 附近我的设备 即可查看到另外一台设备。
●分布式模拟器 会自动组网,不需要手动做其他操作。(设定的超级终端中看不出来已经组网成功)
●运行到真机上需要进行签名,模拟器则不需要。

代码下载

gitee HarmonySoftBus

github HarmonySoftBus

先看下效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码结构

在这里插入图片描述
●adapter:DevicesListAdapter,用于向ListContainer控件中填充设备数据。
●component:SelectDeviceDialog封装了设备选择弹框
●proxy:定义了连接远程和调用远程service(PA)的接口、实现类以及代理。
●service:RemoteService为被控制端service,供手机端远程调用。

申请权限

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

1.ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE:用于允许监听分布式组网内的设备状态变化。
2.ohos.permission.GET_DISTRIBUTED_DEVICE_INFO:用于允许获取分布式组网内的设备列表和设备信息。
3.ohos.permission.GET_BUNDLE_INFO:用于查询其他应用的信息。
4.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跨设备迁移(可回迁)

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

步骤一

想要迁移的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逻辑无需变化,即可拥有鸿蒙特性,例如 服务卡片。

奇怪的知识

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

设计字段:

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

在这里插入图片描述

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

数据存储:

在这里插入图片描述

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

查询:

在这里插入图片描述

坑点: 下次查询时,需要 query.reset();

写在最后

●如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我两个小忙:
●点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
●关注小编,同时可以期待后续文章ing ,不定期分享原创知识。
在这里插入图片描述

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值