91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HarmonyOS中如何進行跨端遷移

OpenHarmony技術(shù)社區(qū) ? 來源:鴻蒙技術(shù)社區(qū) ? 作者:曾瑞紳 ? 2021-11-15 09:38 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

流轉(zhuǎn)在 HarmonyOS 中泛指多設(shè)備分布式操作,也是 HarmonyOS 的亮點之一。

流轉(zhuǎn)按體驗可以分為跨端遷移和多端協(xié)同,這里主要跟大家講一下如何進行跨端遷移,以及我在項目開發(fā)過程中,所遇到的問題與解決方法。

具體概念這里就不做過多的贅述了,大家可以查閱官方文檔:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/hop-overview-0000001092995092

開發(fā)步驟

在開發(fā)過程中,我們可以根據(jù)業(yè)務(wù)需求分為以下兩種場景:

  • 同個 FA 之間的遷移(Ability1—Ability1)

  • 不同 FA 之間的遷移(Ability1—Ability2)

下面給大家介紹一下以上兩種場景的具體的開發(fā)步驟。 ①同個 FA 之間的遷移

同個 FA 之間的遷移是指不同設(shè)備端安裝了同個 FA,官方文檔已經(jīng)有比較詳細的開發(fā)步驟,下面只給大家講一下需要注意的事項及我所遇到的問題避免大家踩坑。

我們在創(chuàng)建完一個 FA 之后,因為我們大部門的業(yè)務(wù)邏輯都是在 AbilitySlice,所以我們在 Ability 及 AbilitySlice 都要去實現(xiàn) IAbilityContinuation 接口。

并且將 Ability 中實現(xiàn)的 onStartContinuation()、onSaveData(IntentParams intentParams)、onRestoreData(IntentParams intentParams)的返回值,都設(shè)為 true。

publicclassMainAbilityextendsAbilityimplementsIAbilityContinuation{

@Override
publicbooleanonStartContinuation(){
returntrue;
}

@Override
publicbooleanonSaveData(IntentParamsintentParams){
returntrue;
}

@Override
publicbooleanonRestoreData(IntentParamsintentParams){
returntrue;
}
//省略部分代碼
...
}

在對應(yīng)的 FA 模塊的 config.json 中,配置對應(yīng)的權(quán)限,且在代碼中也需要動態(tài)申請。
"reqPermissions":[
{
"name":"ohos.permission.DISTRIBUTED_DATASYNC"},
{
"name":"ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE"},
{
"name":"ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"},
{
"name":"ohos.permission.GET_BUNDLE_INFO"}
]

if(canRequestPermission(SystemPermission.DISTRIBUTED_DATASYNC)){
//是否可以申請彈框授權(quán)(首次申請或者用戶未選擇禁止且不再提示)
requestPermissionsFromUser(
newString[]{SystemPermission.DISTRIBUTED_DATASYNC},PERMISSIONS_REQUEST_DISTRIBUTED);
}

定義相關(guān)參數(shù)、設(shè)置流轉(zhuǎn)任務(wù)管理服務(wù)回調(diào)函數(shù)、注冊流轉(zhuǎn)任務(wù)管理服務(wù)、管理流轉(zhuǎn)的目標設(shè)備,同時需要在流轉(zhuǎn)結(jié)束時解注冊流轉(zhuǎn)任務(wù)管理服務(wù)。

//流轉(zhuǎn)應(yīng)用包名
privateStringBUNDLE_NAME="XXX.XXX.XXX";
//注冊流轉(zhuǎn)任務(wù)管理服務(wù)后返回的Abilitytoken
privateintabilityToken;
//用戶在設(shè)備列表中選擇設(shè)備后返回的設(shè)備ID
privateStringselectDeviceId;
//獲取流轉(zhuǎn)任務(wù)管理服務(wù)管理類
privateIContinuationRegisterManagercontinuationRegisterManager;
//設(shè)置流轉(zhuǎn)任務(wù)管理服務(wù)設(shè)備狀態(tài)變更的回調(diào)
privateIContinuationDeviceCallbackcontinuationDeviceCallback=newIContinuationDeviceCallback(){
@Override
publicvoidonDeviceConnectDone(StringdeviceId,StringdeviceType){
selectDeviceId=deviceId;
continuationRegisterManager.updateConnectStatus(abilityToken,selectDeviceId,DeviceConnectState.CONNECTING.getState(),null);
...
}

@Override
publicvoidonDeviceDisconnectDone(Strings){
getUITaskDispatcher().asyncDispatch(()->{
continuationRegisterManager.updateConnectStatus(abilityToken,selectDeviceId,DeviceConnectState.DIS_CONNECTING.getState(),null);
});
unRegisterContinuation();
}
};
//設(shè)置注冊流轉(zhuǎn)任務(wù)管理服務(wù)回調(diào)
privateRequestCallbackrequestCallback=newRequestCallback(){
@Override
publicvoidonResult(intresult){
abilityToken=result;
}
};
...

@Override
publicvoidonStart(Intentintent){
...
continuationRegisterManager=getContinuationRegisterManager();
}

@Override
publicvoidonStop(){
super.onStop();
//解注冊流轉(zhuǎn)任務(wù)管理服務(wù)
continuationRegisterManager.unregister(abilityToken,null);
//斷開流轉(zhuǎn)任務(wù)管理服務(wù)連接
continuationRegisterManager.disconnect();
}

在 Api5 的時候 IContinuationDeviceCallback 的回調(diào)接口跟官方文檔有些出入,當你選擇設(shè)備后會在 onDeviceConnectDone 返回你所選擇的設(shè)備 ID 及設(shè)備類型。

注冊流轉(zhuǎn)服務(wù)之后我們便可以調(diào)起系統(tǒng)流轉(zhuǎn)選擇設(shè)備彈窗,可以通過 ExtraParams 對設(shè)備進行過濾,如不需要過濾,可不傳。

ExtraParamsparams=newExtraParams();
String[]devTypes=newString[]{ExtraParams.DEVICETYPE_SMART_PHONE,ExtraParams.DEVICETYPE_SMART_WATCH,ExtraParams.DEVICETYPE_SMART_PAD};
params.setDevType(devTypes);
registerContinuation();
//顯示選擇設(shè)備列表
continuationRegisterManager.showDeviceList(abilityToken,params,newRequestCallback(){
@Override
publicvoidonResult(intresult){
}
});

選擇完設(shè)備之后會通過上述的 IContinuationDeviceCallback 的 onDeviceConnectDone 方法進行回調(diào)。

之后通過 continueAbility 方法傳入目標設(shè)備的 DeviceID,將運行的 FA 遷移到目標設(shè)備,實現(xiàn)業(yè)務(wù)在設(shè)備間無縫遷移。

//設(shè)置流轉(zhuǎn)任務(wù)管理服務(wù)設(shè)備狀態(tài)變更的回調(diào)
privateIContinuationDeviceCallbackcontinuationDeviceCallback=newIContinuationDeviceCallback(){
@Override
publicvoidonDeviceConnectDone(StringdeviceId,StringdeviceType){
selectDeviceId=deviceId;
getUITaskDispatcher().asyncDispatch(()->{
continuationRegisterManager.updateConnectStatus(abilityToken,selectDeviceId,DeviceConnectState.CONNECTING.getState(),null);
});
if(selectDeviceId!=null){
continueAbility(selectDeviceId);
}
...
}

@Override
publicvoidonDeviceDisconnectDone(Strings){
...
unRegisterContinuation();
}

};

在 FA 遷移中我覺得最主要的部分就是狀態(tài)和數(shù)據(jù)的傳遞,要讓用戶體驗到”無縫“的用戶體驗,需要通過實現(xiàn) IAbilityContinuation 接口來實現(xiàn)數(shù)據(jù)的傳遞。

主要代碼如下:

@Override
publicbooleanonSaveData(IntentParamssaveData){
//根據(jù)業(yè)務(wù)需求,在這里去設(shè)置需要傳遞的數(shù)據(jù)
saveData.setParam("continueParam",continueParam);
returntrue;
}
@Override
publicbooleanonRestoreData(IntentParamsrestoreData){
//遠端FA遷移傳來的狀態(tài)數(shù)據(jù),開發(fā)者可以按照自身業(yè)務(wù)對這些數(shù)據(jù)進行處理
Objectdata=restoreData.getParam("continueParam");
getUITaskDispatcher().asyncDispatch(()->{

});
returntrue;
}

需要注意的是,在 onRestoreData 處理數(shù)據(jù)更新 UI 的時候,需要在 UI 線程中去更新,否則會報錯。 ②不同 FA 之間的遷移 在實際開發(fā)中可能會因為設(shè)備端的部分需求、UI 的不同,例如車機、手機、手表,從而開發(fā)了不同的 FA。

不同 FA 之間的遷移幾乎與同個 FA 之間遷移配置一致,只是我們的 AbilitySlice 不需要再實現(xiàn) IAbilityContinuation 接口來實現(xiàn)數(shù)據(jù)的同步,而是通過 Intent,具體實現(xiàn)如下。

首先我們先在選擇設(shè)備成功后的回調(diào) IContinuationDeviceCallback 初始化分布式環(huán)境。

//設(shè)置流轉(zhuǎn)任務(wù)管理服務(wù)設(shè)備狀態(tài)變更的回調(diào)
privateIContinuationDeviceCallbackcontinuationDeviceCallback=newIContinuationDeviceCallback(){
@Override
publicvoidonDeviceConnectDone(StringdeviceId,StringdeviceType){
selectDeviceId=deviceId;
//省略部分代碼
...
try{
//初始化分布式環(huán)境
DeviceManager.initDistributedEnvironment(selectDeviceId,newIInitCallback(){
@Override
publicvoidonInitSuccess(Stringsuccess){

}

@Override
publicvoidonInitFailure(Stringfailure,intresult){
}
});
}catch(RemoteExceptione){
e.printStackTrace();
}
...
}
....
};

之前我們是通過 continueAbility() 方法進行跳轉(zhuǎn),而現(xiàn)在我們需要通過 Intent 方法進行跳轉(zhuǎn)。

Intentintent=newIntent();
Operationoperation=newIntent.OperationBuilder()
.withDeviceId(deviceId)
.withBundleName(bundleName)
.withAbilityName(abilityName)
.withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
.build();
intent.setOperation(operation);
IntentParamsintentParams=newIntentParams();
//通過IntentParams傳遞參數(shù)
...
startAbility(intent);

在接收方,我們可以通過 onStart(Intent intent) 方法接受傳遞過來的參數(shù),再根據(jù)自己的業(yè)務(wù)邏輯實現(xiàn)數(shù)據(jù)同步。 ③自定義設(shè)備選擇彈窗 在實際項目開發(fā)中我們也可以自定義流轉(zhuǎn)彈窗樣式,但并不推薦這種方式,經(jīng)測試發(fā)現(xiàn)只有在兩個設(shè)備通過藍牙連接的時候才能獲取到設(shè)備列表,只有在特定的場景。

例如手機與車機、手機與手表在實際使用過程中我們基本上是會保持藍牙連接的,通過這種方式實現(xiàn)流轉(zhuǎn)會更穩(wěn)定。但如果不能保持藍牙實時連接的場景則不推薦。

官方 API提供了 DeviceManager.getDeviceList() 來獲取遠端設(shè)備,具體代碼如下。

publicstaticListgetDeviceList(){
//調(diào)用DeviceManager的getDeviceList接口,通過FLAG_GET_ONLINE_DEVICE標記獲得在線設(shè)備列表
ListonlineDevices=DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
//判斷組網(wǎng)設(shè)備是否為空
if(onlineDevices==null){
LogUtil.e(TAG,"onlinedevicesisnull");
returnnewArrayList<>();
}
returnonlineDevices;
}

獲取到設(shè)備列表后,我們就可以自行實現(xiàn)頁面了,在上述的 showDeviceList() 彈出設(shè)備列表的位置替換成自己的彈窗即可。

結(jié)語

目前在 DevEco Studio 2.1 Release 以上版本已經(jīng)支持跨端遷移的模擬器了。

如果沒有顯示出來可以在 Settings-DevEco Labs 勾選 Enable Super Device。

以上過程是在實際開發(fā)過程中慢慢摸索得出,如有不對的地方,歡迎在評論區(qū)指出,共同探討(附下載)。
https://harmonyos.51cto.com/posts/9013

責(zé)任編輯:haq
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 鴻蒙系統(tǒng)
    +關(guān)注

    關(guān)注

    183

    文章

    2642

    瀏覽量

    69852
  • HarmonyOS
    +關(guān)注

    關(guān)注

    80

    文章

    2153

    瀏覽量

    36054

原文標題:HarmonyOS流轉(zhuǎn),替你踩坑了?。?!

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    HarmonyOS首登微信公開課,分享平臺適配與體驗提升實踐經(jīng)驗

    近日,2026微信公開課PRO在廣州舉行。值得關(guān)注的是,HarmonyOS開發(fā)專家首次以官方分享嘉賓身份亮相開發(fā)者專場,并圍繞“平臺適配與體驗提升”這一主題,深入剖析了微信小程序在平臺開發(fā)
    的頭像 發(fā)表于 02-02 09:22 ?307次閱讀
    <b class='flag-5'>HarmonyOS</b>首登微信公開課,分享<b class='flag-5'>跨</b>平臺適配與體驗提升實踐經(jīng)驗

    對于設(shè)備上的舊固件如何進行備份和恢復(fù)?

    對于設(shè)備上的舊固件,如何進行備份和恢復(fù)?
    發(fā)表于 12-12 08:23

    Taro on HarmonyOS 技術(shù)架構(gòu)深度解析

    on HarmonyOS 的技術(shù)實現(xiàn)方案、核心優(yōu)化策略,以及開源版本的主要特性。 本文將詳細介紹 Taro on HarmonyOS 的技術(shù)架構(gòu)、性能優(yōu)化實踐和開源進展,分享我們在
    的頭像 發(fā)表于 08-04 16:10 ?790次閱讀
    Taro on <b class='flag-5'>HarmonyOS</b> 技術(shù)架構(gòu)深度解析

    軟國際上云遷移服務(wù)充分釋放云計算價值

    華為云生態(tài)的核心合作伙伴,軟國際憑借深厚的行業(yè)積累、成熟的遷移方法論及專業(yè)化工具鏈,為企業(yè)提供到端上云服務(wù),助力客戶實現(xiàn)業(yè)務(wù)無縫遷移,充分釋放云計算價值。
    的頭像 發(fā)表于 07-25 14:32 ?961次閱讀
    <b class='flag-5'>中</b>軟國際上云<b class='flag-5'>遷移</b>服務(wù)充分釋放云計算價值

    HarmonyOS 5】鴻蒙的UIAbility詳解(二)

    HarmonyOS 5】鴻蒙的UIAbility詳解(二) ##鴻蒙開發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##鴻蒙金融類應(yīng)用 (金融理財# 一、前言 今天我們繼續(xù)深入講解
    的頭像 發(fā)表于 07-11 18:17 ?923次閱讀
    【<b class='flag-5'>HarmonyOS</b> 5】鴻蒙<b class='flag-5'>中</b>的UIAbility詳解(二)

    HarmonyOS Next】ArkUI-X休閑益智接水果【進階】

    本文通過ArkUI-X實現(xiàn)平臺接水果游戲,深入探究網(wǎng)絡(luò)圖片在HarmonyOS與iOS設(shè)備上的渲染差異,并提供專業(yè)級優(yōu)化方案。基于WebView的混合架構(gòu),我們實現(xiàn)了單代碼庫雙適配的高效開發(fā)
    發(fā)表于 06-28 22:14

    HarmonyOS next】ArkUI-X休閑益智記憶翻牌【進階】

    本文通過記憶翻牌游戲?qū)崿F(xiàn),揭秘網(wǎng)絡(luò)圖片在HarmonyOS與iOS設(shè)備上的渲染差異,并提供專業(yè)級優(yōu)化方案。基于ArkUI-X的Web組件技術(shù),我們實現(xiàn)了一套代碼雙運行的混合架構(gòu)。 一、平臺
    發(fā)表于 06-28 22:12

    HarmonyOS next】ArkUI-X休閑益智連連看【進階】

    一套代碼雙運行的平臺實踐 在移動應(yīng)用開發(fā),平臺技術(shù)始終是開發(fā)者追求的圣杯。借助ArkUI-X框架,我們僅用一套ArkTS代碼即可實現(xiàn)應(yīng)用在H
    發(fā)表于 06-28 21:51

    HarmonyOS next】ArkUI-X新聞熱搜聚合App【進階】

    平臺開發(fā)的強大能力。開發(fā)者可以復(fù)用超過80%的HarmonyOS代碼快速實現(xiàn)iOS應(yīng)用開發(fā),顯著降低多平臺維護成本。項目已開源至Gitee倉庫,歡迎開發(fā)者共同參與完善。 未來展望: 探索
    發(fā)表于 06-28 21:43

    HarmonyOS next】ArkUI-X休閑益智猜字謎【基礎(chǔ)】

    下圖是在iOS的運行效果 下圖是在HarmonyOS的運行效果 今天咱們來聊聊如何用ArkUI-X這個新興框架實現(xiàn)開發(fā),通過一個猜字
    發(fā)表于 06-26 20:01

    ArkUI-X平臺應(yīng)用改造指南

    工作量大幅增加,開發(fā)成本也隨之上升,而且很難保持一致的交互體驗。 ArkUI-X 平臺框架是基于 HarmonyOS 打造的平臺框架
    發(fā)表于 06-16 23:05

    京東開源Taro on HarmonyOS C-API版本

    近日,京東正式開源了Taro on HarmonyOS C-API 版本,為鴻蒙應(yīng)用開發(fā)提供高性能框架。這次版本的發(fā)布,帶來了更豐富的樣式適配、更高效的渲染性能、更全面的組件支持,讓開發(fā)者以Web范式的方式來開發(fā)出媲美鴻蒙性
    的頭像 發(fā)表于 06-09 09:19 ?1138次閱讀
    京東開源Taro on <b class='flag-5'>HarmonyOS</b> C-API版本

    高壓單探頭設(shè)計的器材應(yīng)如何選型

    在高壓單探頭設(shè)計的過程,器材的選型是尤為重要的,這決定探頭的性能,可靠性和安全性等重要環(huán)節(jié)。從電氣性能到機械結(jié)構(gòu),每一個器件的選型都要經(jīng)過深思熟慮,本文主要從電氣性能方面探討,應(yīng)該如何進行器材的選型。
    的頭像 發(fā)表于 06-05 18:07 ?547次閱讀

    HarmonyOS5云服務(wù)技術(shù)分享--ArkTS開發(fā)Node環(huán)境

    ? 你好呀,開發(fā)者小伙伴們!今天我們來聊聊如何在HarmonyOS(ArkTS API 9及以上)玩轉(zhuǎn)云函數(shù),特別是結(jié)合Node.js和HTTP觸發(fā)器的開發(fā)技巧。文章會手把手帶你從零開始,用最接地
    發(fā)表于 05-22 17:21

    請問STM32WBA65如何進行matter的學(xué)習(xí)?

    STM32WBA65如何進行matter的學(xué)習(xí)?相關(guān)的支持都有哪些?有一個X-CUBE-MATTER,可是這個沒有集成在STM32CubeMX
    發(fā)表于 04-24 07:22