衡阳派盒市场营销有限公司

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

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

3天內不再提示

HarmonyOS中如何進行跨端遷移

OpenHarmony技術社區(qū) ? 來源:鴻蒙技術社區(qū) ? 作者:曾瑞紳 ? 2021-11-15 09:38 ? 次閱讀

流轉在 HarmonyOS 中泛指多設備分布式操作,也是 HarmonyOS 的亮點之一。

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

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

開發(fā)步驟

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

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

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

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

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

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

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

publicclassMainAbilityextendsAbilityimplementsIAbilityContinuation{

@Override
publicbooleanonStartContinuation(){
returntrue;
}

@Override
publicbooleanonSaveData(IntentParamsintentParams){
returntrue;
}

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

在對應的 FA 模塊的 config.json 中,配置對應的權限,且在代碼中也需要動態(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)){
//是否可以申請彈框授權(首次申請或者用戶未選擇禁止且不再提示)
requestPermissionsFromUser(
newString[]{SystemPermission.DISTRIBUTED_DATASYNC},PERMISSIONS_REQUEST_DISTRIBUTED);
}

定義相關參數(shù)、設置流轉任務管理服務回調函數(shù)、注冊流轉任務管理服務、管理流轉的目標設備,同時需要在流轉結束時解注冊流轉任務管理服務。

//流轉應用包名
privateStringBUNDLE_NAME="XXX.XXX.XXX";
//注冊流轉任務管理服務后返回的Abilitytoken
privateintabilityToken;
//用戶在設備列表中選擇設備后返回的設備ID
privateStringselectDeviceId;
//獲取流轉任務管理服務管理類
privateIContinuationRegisterManagercontinuationRegisterManager;
//設置流轉任務管理服務設備狀態(tài)變更的回調
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();
}
};
//設置注冊流轉任務管理服務回調
privateRequestCallbackrequestCallback=newRequestCallback(){
@Override
publicvoidonResult(intresult){
abilityToken=result;
}
};
...

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

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

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

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

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

選擇完設備之后會通過上述的 IContinuationDeviceCallback 的 onDeviceConnectDone 方法進行回調。

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

//設置流轉任務管理服務設備狀態(tài)變更的回調
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è)務需求,在這里去設置需要傳遞的數(shù)據(jù)
saveData.setParam("continueParam",continueParam);
returntrue;
}
@Override
publicbooleanonRestoreData(IntentParamsrestoreData){
//遠端FA遷移傳來的狀態(tài)數(shù)據(jù),開發(fā)者可以按照自身業(yè)務對這些數(shù)據(jù)進行處理
Objectdata=restoreData.getParam("continueParam");
getUITaskDispatcher().asyncDispatch(()->{

});
returntrue;
}

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

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

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

//設置流轉任務管理服務設備狀態(tài)變更的回調
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() 方法進行跳轉,而現(xiàn)在我們需要通過 Intent 方法進行跳轉。

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è)務邏輯實現(xiàn)數(shù)據(jù)同步。 ③自定義設備選擇彈窗 在實際項目開發(fā)中我們也可以自定義流轉彈窗樣式,但并不推薦這種方式,經測試發(fā)現(xiàn)只有在兩個設備通過藍牙連接的時候才能獲取到設備列表,只有在特定的場景。

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

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

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

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

結語

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

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

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

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

    關注

    183

    文章

    2638

    瀏覽量

    66717
  • HarmonyOS
    +關注

    關注

    79

    文章

    1982

    瀏覽量

    30582

原文標題:HarmonyOS流轉,替你踩坑了!!!

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

收藏 人收藏

    評論

    相關推薦

    AKI語言調用庫神助攻C/C++代碼遷移HarmonyOS NEXT

    本帖最后由 HarmonyOS開發(fā)者社區(qū) 于 2025-1-3 15:41 編輯 隨著HarmonyOS NEXT的發(fā)布,越來越多的應用加速推進鴻蒙化。在這一過程,如何高效遷移
    發(fā)表于 01-02 17:08

    HarmonyOS Next 應用元服務開發(fā)-應用接續(xù)動態(tài)配置遷移快速啟動目標應用

    快速啟動目標應用,默認情況下,發(fā)起遷移后不會立即拉起對的目標應用,而是等待遷移數(shù)據(jù)從源傳輸?shù)綄?b class='flag-5'>端后才會拉起應用。若應用希望在用戶發(fā)起接續(xù)
    發(fā)表于 12-31 09:58

    HarmonyOS Next 應用元服務開發(fā)-應用接續(xù)動態(tài)配置遷移保持遷移連續(xù)性

    保證遷移連續(xù)性,由于遷移加載時,目標拉起的應用可能執(zhí)行過自己的遷移狀態(tài)設置命令(如:冷啟動時目標在onCreate
    發(fā)表于 12-30 10:30

    HarmonyOS Next 應用元服務開發(fā)-應用接續(xù)動態(tài)配置遷移按需退出

    按需退出,支持應用動態(tài)選擇遷移成功后是否退出遷移應用(默認遷移成功后退出遷移應用)。如果
    發(fā)表于 12-27 14:39

    HarmonyOS Next 應用元服務開發(fā)-應用接續(xù)動態(tài)配置遷移按需遷移頁面

    。 如果應用使用navigation路由,可以設置不進行頁面棧遷移,并將需要接續(xù)的頁面(或頁面棧)信息保存在want傳遞,然后在目標手動加載指定頁面。應用在源
    發(fā)表于 12-26 15:23

    HarmonyOS Next 應用元服務開發(fā)-應用接續(xù)動態(tài)配置遷移

    支持同應用不同Ability遷移,一般情況下,遷移
    發(fā)表于 12-25 10:10

    HarmonyOS Next 應用元服務開發(fā)-分布式數(shù)據(jù)對象遷移數(shù)據(jù)文件資產遷移

    向用戶申請授權。 二、基礎數(shù)據(jù)遷移 使用分布式數(shù)據(jù)對象,與上述開發(fā)步驟類似,需要在源onContinue()接口中進行數(shù)據(jù)保存,并在對的onCreate()/onNewWant()
    發(fā)表于 12-24 10:11

    HarmonyOS Next 應用元服務開發(fā)-分布式數(shù)據(jù)對象遷移數(shù)據(jù)權限與基礎數(shù)據(jù)

    向用戶申請授權。 二、基礎數(shù)據(jù)遷移 使用分布式數(shù)據(jù)對象,與上述開發(fā)步驟類似,需要在源onContinue()接口中進行數(shù)據(jù)保存,并在對的onCreate()/onNewWant()
    發(fā)表于 12-24 09:40

    揭秘動態(tài)化框架在鴻蒙系統(tǒng)下的高性能解決方案

    作者:京東科技 胡大海 前言 動態(tài)化框架 (后文統(tǒng)稱“ 動態(tài)化” ) 是一個由京東金融大前端團隊全自主研發(fā)的,一份代碼,可以在 HarmonyOS、 iOS、Android、Web四
    的頭像 發(fā)表于 10-08 13:46 ?978次閱讀
    揭秘動態(tài)化<b class='flag-5'>跨</b><b class='flag-5'>端</b>框架在鴻蒙系統(tǒng)下的高性能解決方案

    TINA何進行頻譜分析?

    想問一下TINA何進行頻譜分析,找了好久沒怎么找到,可能設置不對,望指點,謝謝
    發(fā)表于 09-14 07:56

    何進行電源供應設計

    電子發(fā)燒友網站提供《如何進行電源供應設計.pdf》資料免費下載
    發(fā)表于 09-09 10:33 ?0次下載
    如<b class='flag-5'>何進行</b>電源供應設計

    求助,在IR615可以選用哪種vpn協(xié)議?如何進行配置?

    現(xiàn)有多臺IR615路由器,希望將其配置為vpn客戶,連接云服務器的vpn服務 工程師遠程連接云服務器對IR615進行管理 在IR615可以選用哪種vpn協(xié)議?如
    發(fā)表于 07-25 07:53

    HarmonyOS NEXT Developer Beta1最新術語表

    Common Event Service,是HarmonyOS負責處理公共事件的訂閱、發(fā)布和退訂的系統(tǒng)服務。 Cross-device migration,
    發(fā)表于 06-27 16:16

    鴻蒙開發(fā):應用組件設備交互(流轉)【遷移

    遷移的核心任務是將應用的當前狀態(tài)(包括頁面控件、狀態(tài)變量等)無縫遷移到另一設備,從而在新設備上無縫接續(xù)應用體驗。這意味著用戶在一臺設備上進行
    的頭像 發(fā)表于 06-11 17:10 ?1380次閱讀
    鴻蒙開發(fā):應用組件<b class='flag-5'>跨</b>設備交互(流轉)【<b class='flag-5'>跨</b><b class='flag-5'>端</b><b class='flag-5'>遷移</b>】

    【JAVA UI】【HarmonyOS】【Demo】 鴻蒙如何進行 xml 解析

    【鴻蒙】鴻蒙如何進行數(shù)據(jù)解析 【問題描述】有時候我們從服務器獲取是 xml 格式數(shù)據(jù),我們需要將 xml 轉化成 model 對象,該如何使用呢?下面舉個例子說明一下,將分以下幾步進行 1.準備條件
    的頭像 發(fā)表于 02-19 15:59 ?645次閱讀
    【JAVA UI】【<b class='flag-5'>HarmonyOS</b>】【Demo】 鴻蒙如<b class='flag-5'>何進行</b> xml 解析
    BET365官方网| 唐朝百家乐的玩法技巧和规则| 百家乐官网棋牌作弊器| 大发888体育| 百家乐官网乐赌| 百家乐官网园搏彩论坛| 水果机上分器| 百家乐庄闲分布概率| 真人百家乐官网策略| 马牌娱乐场| 十三张百家乐的玩法技巧和规则| 大集汇百家乐官网的玩法技巧和规则 | 百家乐平注资讯| 百家乐单跳双跳| 百家乐官网信誉平台现金投注| 娱乐城开户| KTV百家乐的玩法技巧和规则| 杨公24山日课应验诀| 百家乐官网庄不连的概率| 大发888 打法888 大发官网| 百家乐百胜注码法| 汇丰百家乐官网的玩法技巧和规则 | 真人百家乐送钱| 电子百家乐官网规则| 百家乐官网筹码方形筹码| 澳门永利娱乐| 至尊百家乐娱乐平台| 金三角百家乐官网的玩法技巧和规则 | 百家乐彩金| 千亿百家乐官网的玩法技巧和规则| 百家乐官网游戏开发技术| 揭秘百家乐百分之50| 皇冠网百家乐官网阿| 澳门百家乐官网官网www.bjbj100.com| 波音开户| 大发888客户端 运行| 百家乐的奥秘| 澳门百家乐赢钱| 网上百家乐官网网| 百家乐官网是否有路子| 金尊娱乐|