文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

鸿蒙软总线的简单使用

2024-12-14 01:48

关注

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

软总线是什么?

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

本篇讲到的知识点:

技术要求和环境要求:

基本组件熟练使用,ServiceAbility,CommonEventManager(公共事件开发)

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

获取DevEco Studio 2.2 Beta1

Service Ability

公共事件开发指导

其他

代码下载

gitee HarmonySoftBus

github HarmonySoftBus

先看下效果


代码结构


申请权限

在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,发送控制命令&远端处理数据

客户端创建远程连接代理类

  1. public class MyRemoteProxy implements IRemoteBroker { 
  2.      
  3.     public static final int ERR_OK = 0; 
  4.     private static final String TAG = MyRemoteProxy.class.getSimpleName(); 
  5.     private final IRemoteObject remote; 
  6.     public MyRemoteProxy(IRemoteObject remote) { 
  7.         this.remote = remote; 
  8.     } 
  9.  
  10.     @Override 
  11.     public IRemoteObject asObject() { 
  12.         return remote; 
  13.     } 
  14.      
  15.     // 携带数据向远端Sevice发送请求 
  16.     public int senDataToRemote(int requestType, Map paramMap) { 
  17.         MessageParcel data = MessageParcel.obtain(); 
  18.         MessageParcel reply = MessageParcel.obtain(); 
  19.         MessageOption option = new MessageOption(MessageOption.TF_SYNC); 
  20.         int ec = 1; 
  21.         int result = -1; 
  22.         try { 
  23.             if (paramMap.get("inputString") instanceof String) { 
  24.                 String inputString = (String) paramMap.get("inputString"); 
  25.                 data.writeInt(requestType); 
  26.                 data.writeString(inputString); 
  27.                 remote.sendRequest(requestType, data, reply, option); 
  28.             } 
  29.             ec = reply.readInt(); 
  30.             if (ec != ERR_OK) { 
  31.                 LogUtils.error(TAG, "RemoteException:"); 
  32.             } else { 
  33.                 if (requestType == ConnectManagerIml.REQUEST_PLUS) { 
  34.                     result = reply.readInt();   // 返回成功后拿到远端计算的结果。 
  35.                 } 
  36.             } 
  37.         } catch (RemoteException e) { 
  38.             LogUtils.error(TAG, "RemoteException:"); 
  39.         } finally { 
  40.             ec = ERR_OK; 
  41.             if (result != -1) { 
  42.                 ec = result; 
  43.             } 
  44.             data.reclaim(); 
  45.             reply.reclaim(); 
  46.         } 
  47.         return ec; 
  48.     } 

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

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

远端Service中,创建RemoteObject并处理请求

  1. public class MyRemote extends RemoteObject implements IRemoteBroker { 
  2.     private MyRemote() { 
  3.         super("===MyService_Remote"); 
  4.     } 
  5.     @Override 
  6.     public IRemoteObject asObject() { 
  7.         return this; 
  8.     } 
  9.     @Override 
  10.     public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) { 
  11.         LogUtils.info(TAG, "===onRemoteRequest......"); 
  12.         int requestType = data.readInt(); 
  13.         String inputString = ""
  14.         if (code == REQUEST_SEND_DATA) { 
  15.             inputString = data.readString(); 
  16.             publishInput(requestType, inputString); 
  17.         } else if (code == REQUEST_PLUS) { 
  18.             int a = data.readInt(); 
  19.             int b = data.readInt(); 
  20.             reply.writeInt(ERR_OK); 
  21.             reply.writeInt(a + b); 
  22.             publishPlusResult(requestType, String.valueOf(a + b)); 
  23.         } 
  24.         return true
  25.     } 
  26. @Override 
  27. protected IRemoteObject onConnect(Intent intent) { 
  28.     super.onConnect(intent); 
  29.     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了)


混合打包

目前鸿蒙上的应用有以下三种

如何进行混合打包?

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

奇怪的知识

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

设计字段:

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


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

数据存储:


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

查询:

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

来源:鸿蒙社区内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯