成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

HarmonyOS流轉(zhuǎn)之跨端遷移

開發(fā) 前端 OpenHarmony
流轉(zhuǎn)在HarmonyOS中泛指多設(shè)備分布式操作,也是HarmonyOS的亮點(diǎn)之一。流轉(zhuǎn)按體驗(yàn)可以分為跨端遷移和多端協(xié)同,這里主要跟大家講一下如何進(jìn)行跨端遷移,以及我在項(xiàng)目開發(fā)過程中,所遇到的問題與解決方法。

[[432518]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

前言

流轉(zhuǎn)在HarmonyOS中泛指多設(shè)備分布式操作,也是HarmonyOS的亮點(diǎn)之一。流轉(zhuǎn)按體驗(yàn)可以分為跨端遷移和多端協(xié)同,這里主要跟大家講一下如何進(jìn)行跨端遷移,以及我在項(xiàng)目開發(fā)過程中,所遇到的問題與解決方法。

具體概念這里就不做過多的贅述了,大家可以查閱官方文檔。

開發(fā)步驟

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

  • 同個(gè)FA之間的遷移(Ability1—Ability1);
  • 不同F(xiàn)A之間的遷移(Ability1—Ability2)。

下面給大家介紹一下以上兩種場(chǎng)景的具體的開發(fā)步驟。

同個(gè)FA之間的遷移

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

1.我們?cè)趧?chuàng)建完一個(gè)FA之后,因?yàn)槲覀兇蟛块T的業(yè)務(wù)邏輯都是在AbilitySlice,所以我們?cè)贏bility及AbilitySlice都要去實(shí)現(xiàn)IAbilityContinuation 接口,并且將Ability中實(shí)現(xiàn)的onStartContinuation()、onSaveData(IntentParams intentParams)、onRestoreData(IntentParams intentParams)的返回值,都設(shè)為true。

  1. public class MainAbility extends Ability implements IAbilityContinuation { 
  2.      
  3.     @Override 
  4.     public boolean onStartContinuation() { 
  5.         return true
  6.     } 
  7.  
  8.     @Override 
  9.     public boolean onSaveData(IntentParams intentParams) { 
  10.         return true
  11.     } 
  12.  
  13.     @Override 
  14.     public boolean onRestoreData(IntentParams intentParams) { 
  15.         return true
  16.     } 
  17.     //省略部分代碼 
  18.     ... 

 2.在對(duì)應(yīng)的FA模塊的config.json中,配置對(duì)應(yīng)的權(quán)限,且在代碼中也需要?jiǎng)討B(tài)申請(qǐng)。

  1. "reqPermissions": [ 
  2.  { 
  3.   "name""ohos.permission.DISTRIBUTED_DATASYNC" }, 
  4.  { 
  5.   "name""ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE" }, 
  6.  { 
  7.   "name""ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"}, 
  8.  { 
  9.   "name""ohos.permission.GET_BUNDLE_INFO"
  1. if (canRequestPermission(SystemPermission.DISTRIBUTED_DATASYNC)) { 
  2.     // 是否可以申請(qǐng)彈框授權(quán)(首次申請(qǐng)或者用戶未選擇禁止且不再提示) 
  3.     requestPermissionsFromUser( 
  4.             new String[]{SystemPermission.DISTRIBUTED_DATASYNC}, PERMISSIONS_REQUEST_DISTRIBUTED); 

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

  1. // 流轉(zhuǎn)應(yīng)用包名 
  2.    private String BUNDLE_NAME = "XXX.XXX.XXX";  
  3.    // 注冊(cè)流轉(zhuǎn)任務(wù)管理服務(wù)后返回的Ability token 
  4.    private int abilityToken;  
  5.    // 用戶在設(shè)備列表中選擇設(shè)備后返回的設(shè)備ID 
  6.    private String selectDeviceId; 
  7.    // 獲取流轉(zhuǎn)任務(wù)管理服務(wù)管理類 
  8.    private IContinuationRegisterManager continuationRegisterManager; 
  9. // 設(shè)置流轉(zhuǎn)任務(wù)管理服務(wù)設(shè)備狀態(tài)變更的回調(diào) 
  10. private IContinuationDeviceCallback continuationDeviceCallback = new IContinuationDeviceCallback() { 
  11.    @Override 
  12.    public void onDeviceConnectDone(String deviceId, String deviceType) { 
  13.        selectDeviceId = deviceId; 
  14.        continuationRegisterManager.updateConnectStatus(abilityToken, selectDeviceId, DeviceConnectState.CONNECTING.getState(), null); 
  15.     ... 
  16.    } 
  17.  
  18.    @Override 
  19.    public void onDeviceDisconnectDone(String s) { 
  20.        getUITaskDispatcher().asyncDispatch(() -> { 
  21.            continuationRegisterManager.updateConnectStatus(abilityToken, selectDeviceId, DeviceConnectState.DIS_CONNECTING.getState(), null); 
  22.        }); 
  23.        unRegisterContinuation(); 
  24.    } 
  25.  // 設(shè)置注冊(cè)流轉(zhuǎn)任務(wù)管理服務(wù)回調(diào) 
  26.    private RequestCallback requestCallback = new RequestCallback() { 
  27.        @Override 
  28.        public void onResult(int result) { 
  29.            abilityToken = result; 
  30.        } 
  31.    }; 
  32.    ... 
  33.  
  34.    @Override 
  35.    public void onStart(Intent intent) { 
  36.        ... 
  37.        continuationRegisterManager = getContinuationRegisterManager(); 
  38.    } 
  39.  
  40.    @Override 
  41.    public void onStop() { 
  42.        super.onStop(); 
  43.        // 解注冊(cè)流轉(zhuǎn)任務(wù)管理服務(wù) 
  44.        continuationRegisterManager.unregister(abilityToken, null); 
  45.        // 斷開流轉(zhuǎn)任務(wù)管理服務(wù)連接 
  46.        continuationRegisterManager.disconnect(); 
  47.    } 

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

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

  1. ExtraParams params = new ExtraParams(); 
  2. String[] devTypes = new String[]{ExtraParams.DEVICETYPE_SMART_PHONE, ExtraParams.DEVICETYPE_SMART_WATCH, ExtraParams.DEVICETYPE_SMART_PAD}; 
  3. params.setDevType(devTypes); 
  4. registerContinuation(); 
  5. // 顯示選擇設(shè)備列表 
  6. continuationRegisterManager.showDeviceList(abilityToken, params, new RequestCallback() { 
  7.     @Override 
  8.     public void onResult(int result) { 
  9.     } 
  10. }); 

 5.選擇完設(shè)備之后會(huì)通過上述的IContinuationDeviceCallback的onDeviceConnectDone方法進(jìn)行回調(diào),之后通過continueAbility方法傳入目標(biāo)設(shè)備的DeviceID,將運(yùn)行的FA遷移到目標(biāo)設(shè)備,實(shí)現(xiàn)業(yè)務(wù)在設(shè)備間無縫遷移。

  1. // 設(shè)置流轉(zhuǎn)任務(wù)管理服務(wù)設(shè)備狀態(tài)變更的回調(diào) 
  2. private IContinuationDeviceCallback continuationDeviceCallback = new IContinuationDeviceCallback() { 
  3.     @Override 
  4.     public void onDeviceConnectDone(String deviceId, String deviceType) { 
  5.         selectDeviceId = deviceId; 
  6.         getUITaskDispatcher().asyncDispatch(() -> { 
  7.             continuationRegisterManager.updateConnectStatus(abilityToken, selectDeviceId, DeviceConnectState.CONNECTING.getState(), null); 
  8.         }); 
  9.         if (selectDeviceId != null) { 
  10.             continueAbility(selectDeviceId); 
  11.         } 
  12.         ... 
  13.     } 
  14.  
  15.     @Override 
  16.     public void onDeviceDisconnectDone(String s) { 
  17.         ... 
  18.         unRegisterContinuation(); 
  19.     } 
  20.  
  21. }; 

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

  1. @Override 
  2. public boolean onSaveData(IntentParams saveData) { 
  3.       //根據(jù)業(yè)務(wù)需求,在這里去設(shè)置需要傳遞的數(shù)據(jù) 
  4.       saveData.setParam("continueParam", continueParam); 
  5.       return true
  6.  } 
  7. @Override 
  8. public boolean onRestoreData(IntentParams restoreData) { 
  9.       // 遠(yuǎn)端FA遷移傳來的狀態(tài)數(shù)據(jù),開發(fā)者可以按照自身業(yè)務(wù)對(duì)這些數(shù)據(jù)進(jìn)行處理 
  10.       Object data = restoreData.getParam("continueParam"); 
  11.       getUITaskDispatcher().asyncDispatch(() -> { 
  12.            
  13.         }); 
  14.       return true
  15.  } 

 需要注意的是,在onRestoreData處理數(shù)據(jù)更新UI的時(shí)候,需要在UI線程中去更新,否則會(huì)報(bào)錯(cuò)。

不同F(xiàn)A之間的遷移

在實(shí)際開發(fā)中可能會(huì)因?yàn)樵O(shè)備端的部分需求、UI的不同,例如車機(jī)、手機(jī)、手表,從而開發(fā)了不同的FA。不同F(xiàn)A之間的遷移幾乎與同個(gè)FA之間遷移配置一致,只是我們的AbilitySlice不需要再實(shí)現(xiàn)IAbilityContinuation接口來實(shí)現(xiàn)數(shù)據(jù)的同步,而是通過Intent,具體實(shí)現(xiàn)如下。

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

  1. // 設(shè)置流轉(zhuǎn)任務(wù)管理服務(wù)設(shè)備狀態(tài)變更的回調(diào) 
  2. private IContinuationDeviceCallback continuationDeviceCallback = new IContinuationDeviceCallback() { 
  3.     @Override 
  4.     public void onDeviceConnectDone(String deviceId, String deviceType) { 
  5.         selectDeviceId = deviceId; 
  6.         //省略部分代碼 
  7.         ... 
  8.         try { 
  9.             // 初始化分布式環(huán)境 
  10.             DeviceManager.initDistributedEnvironment(selectDeviceId, new IInitCallback() { 
  11.                 @Override 
  12.                 public void onInitSuccess(String success) { 
  13.  
  14.                 } 
  15.  
  16.                 @Override 
  17.                 public void onInitFailure(String failure, int result) { 
  18.                 } 
  19.             }); 
  20.         } catch (RemoteException e) { 
  21.             e.printStackTrace(); 
  22.         } 
  23.        ... 
  24.     } 
  25.   .... 
  26. }; 

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

  1. Intent intent = new Intent(); 
  2. Operation operation = new Intent.OperationBuilder() 
  3.         .withDeviceId(deviceId) 
  4.         .withBundleName(bundleName) 
  5.         .withAbilityName(abilityName) 
  6.         .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE) 
  7.         .build(); 
  8. intent.setOperation(operation); 
  9. IntentParams intentParams = new IntentParams(); 
  10. //通過IntentParams傳遞參數(shù) 
  11. ... 
  12. startAbility(intent); 

 在接收方,我們可以通過onStart(Intent intent)方法接受傳遞過來的參數(shù),再根據(jù)自己的業(yè)務(wù)邏輯實(shí)現(xiàn)數(shù)據(jù)同步。

自定義設(shè)備選擇彈窗

在實(shí)際項(xiàng)目開發(fā)中我們也可以自定義流轉(zhuǎn)彈窗樣式,但并不推薦這種方式,經(jīng)測(cè)試發(fā)現(xiàn)只有在兩個(gè)設(shè)備通過藍(lán)牙連接的時(shí)候才能獲取到設(shè)備列表,只有在特定的場(chǎng)景,例如手機(jī)與車機(jī)、手機(jī)與手表在實(shí)際使用過程中我們基本上是會(huì)保持藍(lán)牙連接的,通過這種方式實(shí)現(xiàn)流轉(zhuǎn)會(huì)更穩(wěn)定。但如果不能保持藍(lán)牙實(shí)時(shí)連接的場(chǎng)景則不推薦。

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

  1. public static List<DeviceInfo> getDeviceList() { 
  2.     // 調(diào)用DeviceManager的getDeviceList接口,通過FLAG_GET_ONLINE_DEVICE標(biāo)記獲得在線設(shè)備列表 
  3.     List<DeviceInfo> onlineDevices = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE); 
  4.     // 判斷組網(wǎng)設(shè)備是否為空 
  5.     if (onlineDevices == null) { 
  6.         LogUtil.e(TAG, "online devices is null"); 
  7.         return new ArrayList<>(); 
  8.     } 
  9.     return onlineDevices; 

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

效果展示

#星光計(jì)劃1.0# HarmonyOS 流轉(zhuǎn)之跨端遷移-鴻蒙HarmonyOS技術(shù)社區(qū)

結(jié)語

目前在DevEco Studio 2.1 Release以上版本已經(jīng)支持跨端遷移的模擬器了,如果沒有顯示出來可以在Settings-DevEco Labs 勾選Enable Super Device。

文章相關(guān)附件可以點(diǎn)擊下面的原文鏈接前往下載:

https://harmonyos.51cto.com/resource/1426

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2022-08-03 09:58:03

跨端框架實(shí)踐

2022-07-01 17:06:49

Fractio鴻蒙

2021-06-16 15:18:03

鴻蒙HarmonyOS應(yīng)用

2021-01-06 11:21:56

鴻蒙HarmonyOS應(yīng)用開發(fā)

2021-08-17 10:20:14

鴻蒙HarmonyOS應(yīng)用

2022-08-12 08:38:08

攜程小程序Taro跨端解決方案

2010-03-09 09:49:01

Oracle跨平臺(tái)遷移

2022-07-25 17:57:43

技術(shù)跨平臺(tái)

2023-03-05 18:36:52

ChatGpt跨平臺(tái)ORM

2009-03-23 09:05:01

2021-04-27 15:20:41

人工智能機(jī)器學(xué)習(xí)技術(shù)

2021-08-12 10:02:08

鴻蒙HarmonyOS應(yīng)用

2021-05-27 05:22:28

前端引擎平臺(tái)

2016-08-27 22:02:11

前端跨端全棧

2020-11-13 12:09:46

HarmonyOS

2017-05-25 11:08:20

虛擬化云計(jì)算在線遷移

2021-07-08 09:42:04

鴻蒙HarmonyOS應(yīng)用

2018-02-02 16:15:02

Hadoop數(shù)據(jù)遷移集群
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 黄色一级大片在线观看 | 国产免费一区二区 | 日韩电影中文字幕在线观看 | 成人小视频在线观看 | 伊人超碰 | 久久人人网 | 久草热播 | 国产网站在线免费观看 | 久久精品久久精品久久精品 | 欧美日韩亚洲视频 | 国产精品自在线 | 亚洲一区二区在线视频 | 婷婷久久五月 | 91久久久久久 | 日韩欧美中文字幕在线观看 | www网站在线观看 | 欧美性受 | 亚洲日本欧美 | 五月激情婷婷在线 | 婷婷免费在线 | 国产精品日产欧美久久久久 | 91视频播放 | 日韩视频国产 | 色视频成人在线观看免 | 国产亚洲欧美在线视频 | 亚洲成人激情在线观看 | 午夜视频在线 | 欧美视频免费在线 | 中文字幕在线第一页 | 久久网一区二区三区 | 欧美在线视频二区 | 98久久 | 欧美精品一区二区免费 | 日韩在线免费视频 | 国产精品一区一区三区 | 欧美日韩黄 | 美女久久 | 欧美精品91爱爱 | 精品国产不卡一区二区三区 | 精品国产乱码久久久久久牛牛 | 韩国主播午夜大尺度福利 |