时间:2022-04-11 15:31
人气:
作者:admin
分布式软总线是手机、平板、智能穿戴、智慧屏、车机等分布式设备的通信基座,为设备之间的互联互通提供了统一的分布式通信能力。
获取DevEco Studio 2.2 Beta1(HUAWEI DevEco Studio - HarmonyOS应用开发官网)
Service Ability(开发-连接Service (harmonyos.com))
公共事件开发指导(开发-公共事件开发指导 (harmonyos.com)))
gitee HarmonySoftBus(HarmonySoftBus: Harmony软总线的第一次尝试,入门使用。 (gitee.com))
github HarmonySoftBus(GitHub - cl18652469346/HarmonySoftBus: SoftBus Demo)




在entry\src\main\config.json中申请以下4个权限:
此外,还需要在实现Ability的代码中显式声明需要使用多设备协同访问的权限,示例代码如下:




和普通画面的启动类似,withDeviceId("") 为本地画面跳转。
跨设备启动需要携带 远程设备的DeviceID,以及设置 "支持分布式调度系统中的多设备启动"Flag。
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;
}
}
MessageOption.TF_SYNC代表同步,意味着会在sendRequest时阻塞等待来自远端Service的返回。
远端Service返回值是 reply,reply.readInt() 默认会返回0,代表请求成功。若是想携带其他返回值,需要在远端Service中进行处理,下一步会讲到。
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操作。

重点都标记了下,这块没啥好讲的,ServiceAbility的基本连接操作。
场景1:传递加法数据,远端计算后返回给客户端

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

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

跨端迁移开发指导(专题-跨端迁移开发指导 (harmonyos.com)) 目的: 实现正在编辑的页面,流转的另外一台设备,利用分布式的能力提高用户的体验。
想要迁移的Ability以及其下所有的AbilitySlice都必须需要实现一个接口:IAbilityContinuation
坑点1:哪怕你知识想将Ability其中一个Slice进行迁移,也必须将Ability的所有的slice都要实现该接口

onStartContinuationFA请求迁移后,系统首先回调此方法,开发者可以在此回调中决策当前是否可以执行迁移,比如,弹框让用户确认是否开始迁移。
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了)

目前OpenHarmony上的应用有以下三种
如何进行混合打包?
篇幅原因,将会在另外一篇中详细介绍。 请移步: 安卓应用如何混合打包拥有OpenHarmony的卡片服务?(安卓应用如何混合打包拥有OpenHarmony特性? (huawei.com)))
针对:分布式数据服务开发指导 (开发-分布式数据服务开发指导 (harmonyos.com))
单版本分布式数据库的介绍比较简单。存储key-value, value若是复杂点没介绍。若想value中存储很多其他数据,可进行以下操作。

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

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

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