自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

輕松玩轉(zhuǎn)HDC2021趣味闖關(guān)賽平行視界服務(wù)流轉(zhuǎn)

系統(tǒng)
此帖子是對參加HDC2021 Codelabs趣味闖關(guān)賽的總結(jié),此Demo是基于Codelabs里Java電影卡片基礎(chǔ)上開發(fā)的,添加了平行視界,服務(wù)流轉(zhuǎn)功能知識點(diǎn), 先說一下

[[433540]]

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

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

https://harmonyos.51cto.com

一, 前言

此帖子是對參加HDC2021 Codelabs趣味闖關(guān)賽的總結(jié),此Demo是基于Codelabs里Java電影卡片基礎(chǔ)上開發(fā)的,添加了平行視界,服務(wù)流轉(zhuǎn)功能知識點(diǎn), 先說一下。

闖關(guān)賽題要求就是上面介紹的,我是24號才去參加Codelabs挑戰(zhàn)賽的, 23號一直呆在Harmony應(yīng)用與服務(wù)開發(fā)教室聽課, 晚上聽到參加了Codelabs挑戰(zhàn)賽的小伙伴說, 闖關(guān)賽有些難度,特別是平行視界功能,之前沒有接觸過,23號時(shí)小伙伴也沒有完成闖關(guān)賽,音樂會結(jié)束后我們回到酒店,打開電腦來研究起來,我開始是過了一遍Codelabs的平行視界Sample, 然后按照小伙伴說的,先弄一個(gè)電影服務(wù)卡片,然后點(diǎn)擊卡片進(jìn)到電影列表,點(diǎn)擊電影列表某一項(xiàng),平行視界顯示詳情,在詳情頁可以流轉(zhuǎn). 說到服務(wù)卡片, 我們都知道用JS來寫比較快,要簡單些, 由于我們的目的是要弄懂平行視界, 就直接用了Codelabs里的JS電影卡片,想加上平行視界, 看了N遍平行視界Sample, 修改了多次JS電影卡片,最終還是不能實(shí)現(xiàn)平行視界,當(dāng)時(shí)已經(jīng)是零晨3點(diǎn)多了,我和小伙伴說,看來今晚我們搞不定了,會不會是平視視界不支持JS Ability的, 先睡覺了. 第二天到了Codelabs挑戰(zhàn)現(xiàn)場問了一下平行視界支持JS界面嗎? 說不行,目前只支持Java的,無語了. 其實(shí)實(shí)現(xiàn)簡單的平行視界, 也就是兩個(gè)配置文件,一行Java代碼都不用寫, 首先配置一下config.json文件, 然后添加easygo.json文件,配置一下左邊顯示哪個(gè)Ability, 右邊顯示哪個(gè)Ability就可以了,下面來簡單介紹一下開發(fā)過程。

二, 實(shí)現(xiàn)效果

B站視頻:https://www.bilibili.com/video/BV1N34y1Z7Gj/

輕松玩轉(zhuǎn)HDC2021趣味闖關(guān)賽平行視界服務(wù)流轉(zhuǎn)-鴻蒙HarmonyOS技術(shù)社區(qū)

三, 工程搭建

打開Codelabs網(wǎng)站找到Java電影卡片, 點(diǎn)擊參考到gitee下載這個(gè)Sample的源代碼, 上面也說了, 這個(gè)實(shí)例是基于Java電影卡片基礎(chǔ)上, 加入平行視界和服務(wù)流轉(zhuǎn)功能, 下載完成后, 解壓出來, 打開DevEco Studio開發(fā)工具, 點(diǎn)擊File -> Open找到剛才解壓出來的MovieCardDemo電影卡片實(shí)例。

輕松玩轉(zhuǎn)HDC2021趣味闖關(guān)賽平行視界服務(wù)流轉(zhuǎn)-鴻蒙HarmonyOS技術(shù)社區(qū)

四, 新增和修改文件介紹

先說一下項(xiàng)目要簡單支持平行視界, 主要就是兩個(gè)配置文件:

1. config.json配置支持平行視界, 在module下添加:

  1. "metaData": { 
  2.    "customizeData": [ 
  3.       { 
  4.          "name""EasyGoClient"
  5.          "value""true" 
  6.       } 
  7.    ] 

  2. 添加easygo.json文件支持平行視界:

  1.   "easyGoVersion""1.0"
  2.   "client""com.army.study", // 與config.json文件的bundleName一致 
  3.   "logicEntities": [ 
  4.     { 
  5.       "head": { 
  6.         "function""magicwindow"
  7.         "required""true" 
  8.       }, 
  9.       "body": { 
  10.         "mode""1"
  11.         "abilityPairs": [ 
  12.           { 
  13.             "from""com.huawei.cookbook.MainAbility",       // 顯示在平行視界左邊頁面 
  14.             "to""com.huawei.cookbook.MoviesDetailAbility"  // 顯示在平行視界右邊頁面 
  15.           } 
  16.         ], 
  17.         "UX": { 
  18.           "isDraggable""true"
  19.           "supportRotationUxCompat""true"
  20.           "supportDraggingToFullScreen""ALL" 
  21.         } 
  22.       } 
  23.     } 
  24.   ] 

設(shè)備選擇對話框DeviceDialog是封裝好的一個(gè)類, 來自Codelabs平行視界代碼里。

  1. package com.huawei.cookbook; 
  2.  
  3. import com.huawei.cookbook.slice.MoviesDetailAbilitySlice; 
  4. import ohos.aafwk.ability.continuation.*; 
  5. import ohos.app.Context; 
  6. import ohos.hiviewdfx.HiLog; 
  7. import ohos.hiviewdfx.HiLogLabel; 
  8.  
  9. public class DeviceDialog { 
  10.     private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD001100, "chuangguan"); 
  11.     // context Object 
  12.     private final Context context; 
  13.  
  14.     // 獲取流轉(zhuǎn)任務(wù)管理服務(wù)管理類 
  15.     private final IContinuationRegisterManager continuationRegisterManager; 
  16.  
  17.     // Ability token returned after the transfer task management service is registered 
  18.     private int abilityToken; 
  19.  
  20.     // Device ID returned after a user selects a device in the device list 
  21.     private String selectDeviceId; 
  22.  
  23.     // 設(shè)置流轉(zhuǎn)任務(wù)管理服務(wù)設(shè)備狀態(tài)變更的回調(diào) 
  24.     private final IContinuationDeviceCallback callback = new IContinuationDeviceCallback() { 
  25.         @Override 
  26.         public void onDeviceConnectDone(String str, String str1) { 
  27.             // Set the device ID after the user selects the device 
  28.             selectDeviceId = str; 
  29.             continuationRegisterManager.updateConnectStatus(abilityToken, selectDeviceId, 
  30.                     DeviceConnectState.CONNECTED.getState(), null); 
  31.             returnDeviceId(); 
  32.         } 
  33.  
  34.         @Override 
  35.         public void onDeviceDisconnectDone(String str) { 
  36.         } 
  37.     }; 
  38.  
  39.     // 設(shè)置注冊流轉(zhuǎn)任務(wù)管理服務(wù)回調(diào) 
  40.     private final RequestCallback requestCallback = new RequestCallback() { 
  41.         @Override 
  42.         public void onResult(int result) { 
  43.             abilityToken = result; 
  44.         } 
  45.     }; 
  46.  
  47.     /** 
  48.      * Initialize the DeviceDialog, set the transfer task management service management class, 
  49.      * and register the transfer task management service management class. 
  50.      * 
  51.      * @param continuationRegisterManager continuationRegisterManager 
  52.      * @param slice slice 
  53.      * @since 2021-09-10 
  54.      */ 
  55.     public DeviceDialog(IContinuationRegisterManager continuationRegisterManager, Context slice) { 
  56.         this.continuationRegisterManager = continuationRegisterManager; 
  57.         this.context = slice; 
  58.         // 注冊 
  59.         registerManager(); 
  60.     } 
  61.  
  62.     // 注冊流轉(zhuǎn)任務(wù)管理服務(wù)管理類 
  63.     private void registerManager() { 
  64.         // 增加過濾條件 
  65.         ExtraParams params = new ExtraParams(); 
  66.         String[] devTypes = new String[]{ExtraParams.DEVICETYPE_SMART_PAD, ExtraParams.DEVICETYPE_SMART_PHONE}; 
  67.         params.setDevType(devTypes); 
  68.         continuationRegisterManager.register(context.getBundleName(), params, callback, requestCallback); 
  69.     } 
  70.  
  71.     /** 
  72.      * 打開設(shè)備選擇框 
  73.      * 
  74.      * @since 2021-09-10 
  75.      */ 
  76.     public void showDeviceList() { 
  77.         // 設(shè)置過濾設(shè)備類型 
  78.         ExtraParams params = new ExtraParams(); 
  79.         String[] devTypes = new String[]{ExtraParams.DEVICETYPE_SMART_PAD, ExtraParams.DEVICETYPE_SMART_PHONE}; 
  80.         params.setDevType(devTypes); 
  81.         // 注冊 
  82.         continuationRegisterManager.register(context.getBundleName(), params, callback, requestCallback); 
  83.         // 顯示選擇設(shè)備列表 
  84.         continuationRegisterManager.showDeviceList(abilityToken, params, null); 
  85.     } 
  86.  
  87.     // Return the device ID 
  88.     private void returnDeviceId() { 
  89.         HiLog.info(LABEL_LOG, "deviceid::" + selectDeviceId); 
  90.         MoviesDetailAbilitySlice.setDeviceId(selectDeviceId); 
  91.     } 
  92.  
  93.     /** 
  94.      * 斷開流轉(zhuǎn)任務(wù)管理服務(wù) 
  95.      * 
  96.      * @since 2021-09-10 
  97.      */ 
  98.     public void clearRegisterManager() { 
  99.         // 解注冊流轉(zhuǎn)任務(wù)管理服務(wù) 
  100.         continuationRegisterManager.unregister(abilityToken, null); 
  101.         // 斷開流轉(zhuǎn)任務(wù)管理服務(wù)連接 
  102.         continuationRegisterManager.disconnect(); 
  103.     } 

提示對話框Utils公共類:

  1. public static void creatToastDialog(Context context, String message) { 
  2.         Component component = LayoutScatter.getInstance(context) 
  3.                 .parse(ResourceTable.Layout_layout_toast, nullfalse); 
  4.         Component componentText = component.findComponentById(ResourceTable.Id_msg_toast); 
  5.         if (componentText instanceof Text) { 
  6.             ((Text) componentText).setText(message); 
  7.         } 
  8.         new ToastDialog(context) 
  9.                 .setComponent(component) 
  10.                 .setSize(DirectionalLayout.LayoutConfig.MATCH_CONTENT, DirectionalLayout.LayoutConfig.MATCH_CONTENT) 
  11.                 .setAlignment(LayoutAlignment.CENTER).show(); 
  12.     } 

下來說一下關(guān)于服務(wù)流轉(zhuǎn)的代碼, MoviesDetailAbility和MoviesDetailAbilitySlice都實(shí)現(xiàn)IAbilityContinuation接口, 并且實(shí)現(xiàn)接口里的方法:

  1. public class MoviesDetailAbility extends Ability implements IAbilityContinuation { 
  2.     @Override 
  3.     public void onStart(Intent intent) { 
  4.         super.onStart(intent); 
  5.         super.setMainRoute(MoviesDetailAbilitySlice.class.getName()); 
  6.     } 
  7.     @Override 
  8.     public boolean onStartContinuation() { 
  9.         return true
  10.     } 
  11.     @Override 
  12.     public boolean onSaveData(IntentParams intentParams) { 
  13.         return true
  14.     } 
  15.     @Override 
  16.     public boolean onRestoreData(IntentParams intentParams) { 
  17.         return true
  18.     } 
  19.     @Override 
  20.     public void onCompleteContinuation(int i) { 
  21.     } 
  1. public class MoviesDetailAbilitySlice extends AbilitySlice implements IAbilityContinuation { 
  2.    // 此處省略原來的代碼 
  3.  
  4.    @Override 
  5.     public boolean onStartContinuation() { 
  6.         return true
  7.     } 
  8.     @Override 
  9.     public boolean onSaveData(IntentParams saveData) { 
  10.         saveData.setParam("remoteMovieId", movieId); 
  11.         return true
  12.     } 
  13.     @Override 
  14.     public boolean onRestoreData(IntentParams restoreData) { 
  15.         this.movieId = Long.parseLong(restoreData.getParam("remoteMovieId").toString()); 
  16.         return true
  17.     } 
  18.     @Override 
  19.     public void onCompleteContinuation(int i) { 
  20.         isCirculation = false
  21.     } 

要實(shí)現(xiàn)服務(wù)流轉(zhuǎn), 首先要在config.json權(quán)限申請, module下添加:

  1. "reqPermissions": [ 
  2.       { 
  3.         "name""ohos.permission.DISTRIBUTED_DATASYNC"
  4.         "reason""$string:entry_MoviesDetailAbility"
  5.         "usedScene"
  6.         { 
  7.           "ability": [ 
  8.             "com.huawei.cookbook.MainAbility"
  9.             "com.huawei.cookbook.MoviesDetailAbility" 
  10.           ], 
  11.           "when""always" 
  12.         } 
  13.       }, 
  14.       { 
  15.         "name""ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"
  16.         "reason""$string:entry_MoviesDetailAbility"
  17.         "usedScene"
  18.         { 
  19.           "ability": [ 
  20.             "com.huawei.cookbook.MainAbility"
  21.             "com.huawei.cookbook.MoviesDetailAbility" 
  22.           ], 
  23.           "when""always" 
  24.         } 
  25.       } 
  26.     ] 

 同時(shí)也在應(yīng)用入口提供顯示權(quán)限申請:

  1. @Override 
  2.    public void onStart(Intent intent) { 
  3.        super.onStart(intent); 
  4.        super.setMainRoute(MainAbilitySlice.class.getName()); 
  5.        // 聲明跨端遷移訪問的權(quán)限 
  6.        requestPermissionsFromUser(new String[]{"ohos.permission.DISTRIBUTED_DATASYNC"}, 0); 
  7.        addActionRoute(ACTION_DETAIL, MoviesDetailAbilitySlice.class.getName()); 
  8.        initData(); 
  9.        initMyHandler(); 
  10.    } 

 到此就介紹完了, 大家是不是感覺到, 我就是一個(gè)搬運(yùn)工, 在不同的Sample上, 合并成為一個(gè), 這個(gè)Demo確實(shí)是這樣, 把不同的知識點(diǎn)集合在一起, 形成一個(gè)符合要求的應(yīng)用, 下來我打算再寫一個(gè)一樣需求的應(yīng)用, 但是從創(chuàng)建空白項(xiàng)目開始, 把列表顯示, 詳情, 服務(wù)卡片, 平行視界, 服務(wù)流轉(zhuǎn)體驗(yàn)出來, 大家有空也一起根據(jù)需求擼出來吧!!! 下面圖片是當(dāng)時(shí)HDC2021 Codelabs闖關(guān)賽原圖。

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

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

https://harmonyos.51cto.com

 

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

2021-11-15 10:15:37

鴻蒙HarmonyOS應(yīng)用

2021-11-10 16:07:01

鴻蒙HarmonyOS應(yīng)用

2021-11-10 16:08:45

鴻蒙HarmonyOS應(yīng)用

2021-10-29 15:34:45

鴻蒙HarmonyOS應(yīng)用

2021-11-02 14:52:17

鴻蒙HarmonyOS應(yīng)用

2021-10-29 18:11:50

華為智慧助手

2021-11-08 15:02:19

鴻蒙HarmonyOS應(yīng)用

2021-11-03 17:08:22

鴻蒙HarmonyOS應(yīng)用

2021-11-26 10:05:06

鴻蒙HarmonyOS應(yīng)用

2021-10-28 10:11:17

鴻蒙HarmonyOS應(yīng)用

2020-09-24 10:57:12

編程函數(shù)式前端

2021-11-03 17:03:31

鴻蒙HarmonyOS應(yīng)用

2023-08-18 14:39:02

2010-07-09 12:09:34

IT運(yùn)維Mocha BSM摩卡軟件

2024-08-16 14:28:21

2010-09-01 10:09:32

CSS樣式

2015-05-07 11:31:21

服務(wù)器虛擬化深信服

2018-11-16 16:44:27

華為

2021-04-02 14:11:19

辦公
點(diǎn)贊
收藏

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