开发经验教程分享 《鸿蒙软总线的简单使用》

软总线是什么?

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

本篇讲到的知识点:

启动远程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个权限:

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跨设备迁移(可回迁)

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

步骤一

想要迁移的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();

(本文转载自润和HiHope,欢迎前往了解更多HarmonyOS相关产品)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • 2020年9月10日,华为在2020华为开发者大会上发布了HarmonyOS(鸿蒙操作系统)2.0版本。随后网络上...
    尹star阅读 1,925评论 1 7
  • 2020年9月10号,鸿蒙2.0(HarmonyOS 2.0)系统正式发布,鸿蒙2.0面向应用开发者发布Beta版...
    Android开发指南阅读 2,750评论 0 1
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,520评论 28 53
  • 人工智能是什么?什么是人工智能?人工智能是未来发展的必然趋势吗?以后人工智能技术真的能达到电影里机器人的智能水平吗...
    ZLLZ阅读 3,763评论 0 5
  • 首先介绍下自己的背景: 我11年左右入市到现在,也差不多有4年时间,看过一些关于股票投资的书籍,对于巴菲特等股神的...
    瞎投资阅读 5,647评论 3 8