轻松玩转HDC2021趣味闯关赛平行视界服务流转

系统
此帖子是对参加HDC2021 Codelabs趣味闯关赛的总结,此Demo是基于Codelabs里Java电影卡片基础上开发的,添加了平行视界,服务流转功能知识点, 先说一下

[[433540]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

一, 前言

此帖子是对参加HDC2021 Codelabs趣味闯关赛的总结,此Demo是基于Codelabs里Java电影卡片基础上开发的,添加了平行视界,服务流转功能知识点, 先说一下。

闯关赛题要求就是上面介绍的,我是24号才去参加Codelabs挑战赛的, 23号一直呆在Harmony应用与服务开发教室听课, 晚上听到参加了Codelabs挑战赛的小伙伴说, 闯关赛有些难度,特别是平行视界功能,之前没有接触过,23号时小伙伴也没有完成闯关赛,音乐会结束后我们回到酒店,打开电脑来研究起来,我开始是过了一遍Codelabs的平行视界Sample, 然后按照小伙伴说的,先弄一个电影服务卡片,然后点击卡片进到电影列表,点击电影列表某一项,平行视界显示详情,在详情页可以流转. 说到服务卡片, 我们都知道用JS来写比较快,要简单些, 由于我们的目的是要弄懂平行视界, 就直接用了Codelabs里的JS电影卡片,想加上平行视界, 看了N遍平行视界Sample, 修改了多次JS电影卡片,最终还是不能实现平行视界,当时已经是零晨3点多了,我和小伙伴说,看来今晚我们搞不定了,会不会是平视视界不支持JS Ability的, 先睡觉了. 第二天到了Codelabs挑战现场问了一下平行视界支持JS界面吗? 说不行,目前只支持Java的,无语了. 其实实现简单的平行视界, 也就是两个配置文件,一行Java代码都不用写, 首先配置一下config.json文件, 然后添加easygo.json文件,配置一下左边显示哪个Ability, 右边显示哪个Ability就可以了,下面来简单介绍一下开发过程。

二, 实现效果

B站视频:https://www.bilibili.com/video/BV1N34y1Z7Gj/

轻松玩转HDC2021趣味闯关赛平行视界服务流转-鸿蒙HarmonyOS技术社区

三, 工程搭建

打开Codelabs网站找到Java电影卡片, 点击参考到gitee下载这个Sample的源代码, 上面也说了, 这个实例是基于Java电影卡片基础上, 加入平行视界和服务流转功能, 下载完成后, 解压出来, 打开DevEco Studio开发工具, 点击File -> Open找到刚才解压出来的MovieCardDemo电影卡片实例。

轻松玩转HDC2021趣味闯关赛平行视界服务流转-鸿蒙HarmonyOS技术社区

四, 新增和修改文件介绍

先说一下项目要简单支持平行视界, 主要就是两个配置文件:

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.   ] 

设备选择对话框DeviceDialog是封装好的一个类, 来自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.     // 获取流转任务管理服务管理类 
  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.     // 设置流转任务管理服务设备状态变更的回调 
  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.     // 设置注册流转任务管理服务回调 
  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.     // 注册流转任务管理服务管理类 
  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.      * 打开设备选择框 
  73.      * 
  74.      * @since 2021-09-10 
  75.      */ 
  76.     public void showDeviceList() { 
  77.         // 设置过滤设备类型 
  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.         // 显示选择设备列表 
  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.      * 断开流转任务管理服务 
  95.      * 
  96.      * @since 2021-09-10 
  97.      */ 
  98.     public void clearRegisterManager() { 
  99.         // 解注册流转任务管理服务 
  100.         continuationRegisterManager.unregister(abilityToken, null); 
  101.         // 断开流转任务管理服务连接 
  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.     } 

下来说一下关于服务流转的代码, MoviesDetailAbility和MoviesDetailAbilitySlice都实现IAbilityContinuation接口, 并且实现接口里的方法:

  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.     } 

要实现服务流转, 首先要在config.json权限申请, 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.     ] 

 同时也在应用入口提供显示权限申请:

  1. @Override 
  2.    public void onStart(Intent intent) { 
  3.        super.onStart(intent); 
  4.        super.setMainRoute(MainAbilitySlice.class.getName()); 
  5.        // 声明跨端迁移访问的权限 
  6.        requestPermissionsFromUser(new String[]{"ohos.permission.DISTRIBUTED_DATASYNC"}, 0); 
  7.        addActionRoute(ACTION_DETAIL, MoviesDetailAbilitySlice.class.getName()); 
  8.        initData(); 
  9.        initMyHandler(); 
  10.    } 

 到此就介绍完了, 大家是不是感觉到, 我就是一个搬运工, 在不同的Sample上, 合并成为一个, 这个Demo确实是这样, 把不同的知识点集合在一起, 形成一个符合要求的应用, 下来我打算再写一个一样需求的应用, 但是从创建空白项目开始, 把列表显示, 详情, 服务卡片, 平行视界, 服务流转体验出来, 大家有空也一起根据需求撸出来吧!!! 下面图片是当时HDC2021 Codelabs闯关赛原图。

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2021-11-15 10:15:37

鸿蒙HarmonyOS应用

2021-11-10 16:08:45

鸿蒙HarmonyOS应用

2021-11-10 16:07:01

鸿蒙HarmonyOS应用

2021-10-29 15:34:45

鸿蒙HarmonyOS应用

2021-11-02 14:52:17

鸿蒙HarmonyOS应用

2021-11-08 15:02:19

鸿蒙HarmonyOS应用

2021-10-29 18:11:50

华为智慧助手

2021-11-03 17:08:22

鸿蒙HarmonyOS应用

2021-11-26 10:05:06

鸿蒙HarmonyOS应用

2021-10-28 10:11:17

鸿蒙HarmonyOS应用

2020-09-24 10:57:12

编程函数式前端

2010-07-09 12:09:34

IT运维Mocha BSM摩卡软件

2021-11-03 17:03:31

鸿蒙HarmonyOS应用

2023-08-18 14:39:02

2010-09-01 10:09:32

CSS样式

2018-11-16 16:44:27

华为

2015-05-07 11:31:21

服务器虚拟化深信服

2011-03-23 12:44:06

Nagios监控

2014-08-19 09:10:45

IT运维
点赞
收藏

51CTO技术栈公众号