軟總線是什么?分布式軟總線是手機(jī)、平板、智能穿戴、智慧屏、車機(jī)等分布式設(shè)備的通信基座,為設(shè)備之間的互聯(lián)互通提供了統(tǒng)一的分布式通信能力。
本篇講到的知識點:
啟動遠(yuǎn)程 FA(Feature Ability)
連接遠(yuǎn)程 PA(Particle Ability),發(fā)送控制命令&遠(yuǎn)端處理數(shù)據(jù)(場景 1:傳遞加法數(shù)據(jù),遠(yuǎn)端計算后返回給客戶端。場景 2:傳遞數(shù)據(jù),遠(yuǎn)端 Service 接收后更新遠(yuǎn)端的 UI。)
FA 跨設(shè)備遷移(可回遷)
混合打包
其他奇怪的知識
技術(shù)要求和環(huán)境要求:
基本組件熟練使用,ServiceAbility,CommonEventManager(公共事件開發(fā))
兩臺 HarmonyOS 2.0 的真機(jī) 或 DevEco Studio 2.2 Beta1(分布式模擬器的自動開啟,可同時模擬運(yùn)行兩臺設(shè)備,且自動組網(wǎng))。
獲取 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
公共事件開發(fā)指導(dǎo):
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-notification-fwk-common-event-0000000000029871
其他:
真機(jī)分布式通信要求:同一局域網(wǎng)內(nèi),登錄相同華為賬號,開啟藍(lán)牙(可行方案),這樣在設(shè)定-超級終端中附近我的設(shè)備即可查看到另外一臺設(shè)備。
分布式模擬器會自動組網(wǎng),不需要手動做其他操作。(設(shè)定的超級終端中看不出來已經(jīng)組網(wǎng)成功)
運(yùn)行到真機(jī)上需要進(jìn)行簽名,模擬器則不需要。
代碼下載
gitee HarmonySoftBus:
https://gitee.com/shmily_cl/HarmonySoftBus
github HarmonySoftBus:
https://github.com/cl18652469346/HarmonySoftBus
代碼結(jié)構(gòu):
adapter:DevicesListAdapter,用于向 ListContainer 控件中填充設(shè)備數(shù)據(jù)。
component:SelectDeviceDialog 封裝了設(shè)備選擇彈框。
proxy:定義了連接遠(yuǎn)程和調(diào)用遠(yuǎn)程 service(PA)的接口、實現(xiàn)類以及代理。
service:RemoteService 為被控制端 service,供手機(jī)端遠(yuǎn)程調(diào)用。
申請權(quán)限
在 entrysrcmainconfig.json 中申請以下 4 個權(quán)限:
ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE:用于允許監(jiān)聽分布式組網(wǎng)內(nèi)的設(shè)備狀態(tài)變化。
ohos.permission.GET_DISTRIBUTED_DEVICE_INFO:用于允許獲取分布式組網(wǎng)內(nèi)的設(shè)備列表和設(shè)備信息。
ohos.permission.GET_BUNDLE_INFO:用于查詢其他應(yīng)用的信息。
ohos.permission.DISTRIBUTED_DATASYNC:用于允許不同設(shè)備間的數(shù)據(jù)交換。
此外,還需要在實現(xiàn) Ability 的代碼中顯式聲明需要使用多設(shè)備協(xié)同訪問的權(quán)限,示例代碼如下:
獲取組網(wǎng)內(nèi)在線的其他設(shè)備 DeviceInfo(Id&Name):
獲取自身設(shè)備的 Id:
啟動遠(yuǎn)程 FA:
和普通畫面的啟動類似,withDeviceId(“”) 為本地畫面跳轉(zhuǎn)。
跨設(shè)備啟動需要攜帶遠(yuǎn)程設(shè)備的 DeviceID,以及設(shè)置 “支持分布式調(diào)度系統(tǒng)中的多設(shè)備啟動”Flag。
連接遠(yuǎn)程 PA,發(fā)送控制命令&遠(yuǎn)端處理數(shù)據(jù)
第一步:客戶端創(chuàng)建遠(yuǎn)程連接代理類
代碼如下:
public class MyRemoteProxy implements IRemoteBroker {
/**
* 遠(yuǎn)端響應(yīng)成功的標(biāo)識
*/
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;
}
// 攜帶數(shù)據(jù)向遠(yuǎn)端Sevice發(fā)送請求
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(); // 返回成功后拿到遠(yuǎn)端計算的結(jié)果。
}
}
} catch (RemoteException e) {
LogUtils.error(TAG, “RemoteException:”);
} finally {
ec = ERR_OK;
if (result != -1) {
ec = result;
}
data.reclaim();
reply.reclaim();
}
return ec;
}
}
①實現(xiàn) IRemoteBroker 接口,asObject 返回遠(yuǎn)程 RemoteObject 對象。
②創(chuàng)建構(gòu)造方法(參數(shù)為 connectAbility 成功時回調(diào)方法 onAbilityConnectDone 中的遠(yuǎn)程操作對象)。
③封裝向遠(yuǎn)端發(fā)送請求的方法,便于后續(xù)進(jìn)行控制(本例中是簡單的加法請求)。
MessageOption.TF_SYNC 代表同步,意味著會在 sendRequest 時阻塞等待來自遠(yuǎn)端 Service 的返回。
遠(yuǎn)端 Service 返回值是 reply,reply.readInt() 默認(rèn)會返回 0,代表請求成功。若是想攜帶其他返回值,需要在遠(yuǎn)端 Service 中進(jìn)行處理,下一步會講到。
第二步:遠(yuǎn)端 Service 中,創(chuàng)建 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;
}
}
@Overrideprotected IRemoteObject onConnect(Intent intent) {
super.onConnect(intent);
return remote.asObject();
}
onRemoteRequest 接收來自 sendRequest(requestType,data,reply,option);傳遞過來的請求類型,數(shù)據(jù),返回值,請求類型。
一般不需要處理 reply,客戶端 reply.readInt() 也會拿到 0(表示請求成功),若是需要在遠(yuǎn)端接收到請求后,需要額外返回數(shù)據(jù)給客戶端,則需要進(jìn)行 write 操作。
第三步:連接遠(yuǎn)端 Service
代碼如下圖:
重點都標(biāo)記了下,這塊沒啥好講的,ServiceAbility 的基本連接操作。
第四步:發(fā)送命令,遠(yuǎn)端 Service 處理數(shù)據(jù)(返回數(shù)據(jù)、更新 UI)
場景 1:傳遞加法數(shù)據(jù),遠(yuǎn)端計算后返回給客戶端。
場景 2:傳遞數(shù)據(jù),遠(yuǎn)端 Service 接收后更新遠(yuǎn)端的 UI。
遠(yuǎn)端 Service 在 onRemoteRequest 中處理更新 UI 的請求,遠(yuǎn)端利用公共事件,進(jìn)行 UI 的更新。(意味著也就可以控制音樂的播放,暫停等等)
FA 跨設(shè)備遷移(可回遷)
跨端遷移開發(fā)指導(dǎo):
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/hop-cross-device-migration-guidelines-0000001146058939
目的:實現(xiàn)正在編輯的頁面,流轉(zhuǎn)的另外一臺設(shè)備,利用分布式的能力提高用戶的體驗。
步驟一
想要遷移的 Ability 以及其下所有的 AbilitySlice 都必須需要實現(xiàn)一個接口:IAbilityContinuation。
坑點 1:哪怕你知識想將 Ability 其中一個 Slice 進(jìn)行遷移,也必須將 Ability 的所有的 slice 都要實現(xiàn)該接口。
onStartContinuation FA 請求遷移后,系統(tǒng)首先回調(diào)此方法,開發(fā)者可以在此回調(diào)中決策當(dāng)前是否可以執(zhí)行遷移,比如,彈框讓用戶確認(rèn)是否開始遷移。
onSaveData(IntentParams saveData)如果 onStartContinuation() 返回 true,則系統(tǒng)回調(diào)此方法,開發(fā)者在此回調(diào)中保存必須傳遞到目標(biāo)端設(shè)備上,用于恢復(fù) FA 狀態(tài)的數(shù)據(jù)。
onRestoreData(IntentParams restoreData)發(fā)起端設(shè)備上 FA 完成保存數(shù)據(jù)后,系統(tǒng)在目標(biāo)端設(shè)備上回調(diào)此方法,開發(fā)者在此回調(diào)中接受用于恢復(fù) FA 狀態(tài)的數(shù)據(jù)。
onCompleteContinuation(int result)目標(biāo)端設(shè)備上恢復(fù)數(shù)據(jù)一旦完成,系統(tǒng)就會在發(fā)起端設(shè)備上回調(diào) FA 的此方法,以便通知應(yīng)用遷移流程已結(jié)束。
坑點 2:不要忘記 return true;Ability 中也要。
坑點 3:onRestoreData 進(jìn)行 UI 的恢復(fù)時,需要切換到 UI 線程,否則。。。(沒報錯 Log)
步驟二
可回遷的遷移:
回遷(若是已經(jīng)回遷了,再進(jìn)行回遷,會報錯。先 try-catch 了):
混合打包
目前鴻蒙上的應(yīng)用有以下三種:
直接運(yùn)行的安卓應(yīng)用。
使用 DevEco Studio 編寫的鴻蒙應(yīng)用。
已有開發(fā)好的安卓應(yīng)用,想擁有鴻蒙的一些特性,從而進(jìn)行混合打包。apk 邏輯無需變化,即可擁有鴻蒙特性,例如服務(wù)卡片。
如何進(jìn)行混合打包?篇幅原因,將會在另外一篇中詳細(xì)介紹。請移步:安卓應(yīng)用如何混合打包擁有鴻蒙的卡片服務(wù)?
https://developer.huawei.com/consumer/cn/blog/topic/03637432111020021
奇怪的知識
針對:分布式數(shù)據(jù)服務(wù)開發(fā)指導(dǎo)。
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/database-mdds-guidelines-0000001113961404
①設(shè)計字段
單版本分布式數(shù)據(jù)庫的介紹比較簡單。存儲 key-value,value 若是復(fù)雜點沒介紹。若想 value 中存儲很多其他數(shù)據(jù),可進(jìn)行以下操作。
以上時創(chuàng)建單版本分布式數(shù)據(jù)庫時,設(shè)置 Schema 對象,從而設(shè)計了數(shù)據(jù)庫中的字段。
②數(shù)據(jù)存儲
存入的時候,需要以 json 的格式進(jìn)行寫入。
③查詢
坑點:下次查詢時,需要 query.reset();
編輯:jq
-
總線
+關(guān)注
關(guān)注
10文章
2849瀏覽量
87842 -
分布式
+關(guān)注
關(guān)注
1文章
843瀏覽量
74422 -
代碼
+關(guān)注
關(guān)注
30文章
4697瀏覽量
68085 -
模擬器
+關(guān)注
關(guān)注
2文章
862瀏覽量
43087 -
鴻蒙
+關(guān)注
關(guān)注
57文章
2291瀏覽量
42632 -
HiHope
+關(guān)注
關(guān)注
0文章
63瀏覽量
3518
原文標(biāo)題:鴻蒙軟總線,超詳細(xì)教程來啦!
文章出處:【微信號:Huawei_Kirin,微信公眾號:華為麒麟】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論