首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

鸿蒙HarmonyOS开发实战—流转(跨端迁移 二)

  • 25-02-22 03:41
  • 3799
  • 9338
blog.csdn.net
开发步骤

完成环境搭建,在DevEco Studio中,选择手机设备,Empty Feature Ability(Java)模板创建项目,在项目自动创建的MainAbility中实现IAbilityContinuation接口。

  1. public class MainAbility extends Ability implements IAbilityContinuation {
  2. private static final int DOMAIN_ID = 0xD001100;
  3. private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, DOMAIN_ID, "MainAbility");
  4. @Override
  5. public void onStart(Intent intent) {
  6. super.onStart(intent);
  7. super.setMainRoute(MainAbilitySlice.class.getName());
  8. }
  9. // 为了方便演示,不在Ability实现流转逻辑,具体逻辑在AbilitySlice中实现
  10. @Override
  11. public boolean onStartContinuation() {
  12. HiLog.info(LABEL_LOG, "onStartContinuation called");
  13. return true;
  14. }
  15. @Override
  16. public boolean onSaveData(IntentParams saveData) {
  17. HiLog.info(LABEL_LOG, "onSaveData called");
  18. return true;
  19. }
  20. @Override
  21. public boolean onRestoreData(IntentParams restoreData) {
  22. HiLog.info(LABEL_LOG, "onRestoreData called");
  23. return true;
  24. }
  25. @Override
  26. public void onCompleteContinuation(int result) {
  27. HiLog.info(LABEL_LOG, "onCompleteContinuation called");
  28. }
  29. @Override
  30. public void onFailedContinuation(int errorCode) {
  31. HiLog.info(LABEL_LOG, "onFailedContinuation called");
  32. }
  33. }

复制

在AbilitySlice中实现一个用于控制基础功能的页面,以下演示代码逻辑都将在AbilitySlice中实现,代码示例如下:

  1. public class MainAbilitySlice extends AbilitySlice {
  2. @Override
  3. public void onStart(Intent intent) {
  4. super.onStart(intent);
  5. // 开发者可以自行进行界面设计
  6. // 为按钮设置统一的背景色
  7. // 例如通过PositionLayout可以实现简单界面
  8. PositionLayout layout = new PositionLayout(this);
  9. LayoutConfig config = new LayoutConfig(LayoutConfig.MATCH_PARENT, LayoutConfig.MATCH_PARENT);
  10. layout.setLayoutConfig(config);
  11. ShapeElement buttonBg = new ShapeElement();
  12. buttonBg.setRgbColor(new RgbColor(0, 125, 255));
  13. super.setUIContent(layout);
  14. }
  15. @Override
  16. public void onInactive() {
  17. super.onInactive();
  18. }
  19. @Override
  20. public void onActive() {
  21. super.onActive();
  22. }
  23. @Override
  24. public void onBackground() {
  25. super.onBackground();
  26. }
  27. @Override
  28. public void onForeground(Intent intent) {
  29. super.onForeground(intent);
  30. }
  31. @Override
  32. public void onStop() {
  33. super.onStop();
  34. }
  35. }

复制

在MainAbility对应的config.json中声明跨端迁移访问的权限:ohos.permission.DISTRIBUTED_DATASYNC。在config.json中的配置如下:

  1. {
  2. "module": {
  3. "reqPermissions": [
  4. {
  5. "name": "ohos.permission.DISTRIBUTED_DATASYNC",
  6. "reason": "need",
  7. "usedScene": {
  8. "ability": [
  9. "MainAbility"
  10. ],
  11. "when": "inuse"
  12. }
  13. }
  14. ],
  15. ...
  16. }
  17. ...
  18. }

复制

此外,还需要在MainAbility的onStart()中,调用requestPermissionsFromUser()方法向用户申请权限,代码示例如下:

  1. public class MainAbility extends Ability implements IAbilityContinuation {
  2. @Override
  3. public void onStart(Intent intent) {
  4. super.onStart(intent);
  5. // 开发者显示声明需要使用的权限
  6. requestPermissionsFromUser(new String[]{"ohos.permission.DISTRIBUTED_DATASYNC"}, 0);
  7. ...
  8. }
  9. ...
  10. }

复制

设置流转任务管理服务回调函数,注册流转任务管理服务,管理流转的目标设备,同时需要在流转结束时解注册流转任务管理服务。

  1. public class MainAbilitySlice extends AbilitySlice {
  2. // 流转应用包名
  3. private String BUNDLE_NAME = "XXX.XXX.XXX";
  4. // 注册流转任务管理服务后返回的Ability token
  5. private int abilityToken;
  6. // 用户在设备列表中选择设备后返回的设备ID
  7. private String selectDeviceId;
  8. // 用户是否已发起可拉回流转流程
  9. private boolean isReversibly = false;
  10. // 获取流转任务管理服务管理类
  11. private IContinuationRegisterManager continuationRegisterManager;
  12. // 设置流转任务管理服务设备状态变更的回调
  13. private IContinuationDeviceCallback callback = new IContinuationDeviceCallback() {
  14. @Override
  15. public void onConnected(ContinuationDeviceInfo deviceInfo) {
  16. // 在用户选择设备后设置设备ID
  17. selectDeviceId = deviceInfo.getDeviceId();
  18. //更新选择设备后的流转状态
  19. continuationRegisterManager.updateConnectStatus(abilityToken, selectDeviceId, DeviceConnectState.CONNECTED.getState(), null);
  20. }
  21. @Override
  22. public void onDisconnected(String deviceId) {
  23. }
  24. };
  25. // 设置注册流转任务管理服务回调
  26. private RequestCallback requestCallback = new RequestCallback() {
  27. @Override
  28. public void onResult(int result) {
  29. abilityToken = result;
  30. }
  31. };
  32. ...
  33. @Override
  34. public void onStart(Intent intent) {
  35. ...
  36. continuationRegisterManager = getContinuationRegisterManager();
  37. }
  38. @Override
  39. public void onStop() {
  40. super.onStop();
  41. // 解注册流转任务管理服务
  42. continuationRegisterManager.unregister(abilityToken, null);
  43. // 断开流转任务管理服务连接
  44. continuationRegisterManager.disconnect();
  45. }

复制

为不同功能设置相应的控制按钮。

  1. // 建议开发者按照自己的界面进行按钮设计,示例代码仅供参考
  2. private static final int OFFSET_X = 100;
  3. private static final int OFFSET_Y = 100;
  4. private static final int ADD_OFFSET_Y = 150;
  5. private static final int BUTTON_WIDTH = 800;
  6. private static final int BUTTON_HEIGHT = 100;
  7. private static final int TEXT_SIZE = 50;
  8. private int offsetY = 0;
  9. private Button createButton(String text, ShapeElement buttonBg) {
  10. Button button = new Button(this);
  11. button.setContentPosition(OFFSET_X, OFFSET_Y + offsetY);
  12. offsetY += ADD_OFFSET_Y;
  13. button.setWidth(BUTTON_WIDTH);
  14. button.setHeight(BUTTON_HEIGHT);
  15. button.setTextSize(TEXT_SIZE);
  16. button.setTextColor(Color.YELLOW);
  17. button.setText(text);
  18. button.setBackground(buttonBg);
  19. return button;
  20. }
  21. // 按照顺序在PositionLayout中依次添加按钮的示例
  22. private void addComponents(PositionLayout linear, ShapeElement buttonBg) {
  23. // 构建显示注册流转任务管理服务的按钮
  24. Button btnRegister = createButton("register", buttonBg);
  25. btnRegister.setClickedListener(mRegisterListener);
  26. linear.addComponent(btnRegister);
  27. // 构建显示设备列表的按钮
  28. Button btnShowDeviceList = createButton("ShowDeviceList", buttonBg);
  29. btnShowDeviceList.setClickedListener(mShowDeviceListListener);
  30. linear.addComponent(btnShowDeviceList);
  31. // 构建跨端迁移FA的按钮
  32. Button btnContinueRemoteFA = createButton("ContinueRemoteFA", buttonBg);
  33. btnContinueRemoteFA.setClickedListener(mContinueAbilityListener);
  34. linear.addComponent(btnContinueRemoteFA);
  35. // 构建可拉回迁移FA的按钮
  36. Button btnContinueReversibly = createButton("ContinueReversibly", buttonBg);
  37. btnContinueReversibly.setClickedListener(mContinueReversiblyListener);
  38. linear.addComponent(btnContinueReversibly);
  39. // 构建拉回FA的按钮
  40. Button btnReverseContinue = createButton("ReverseContinuation", buttonBg);
  41. btnReverseContinue.setClickedListener(mReverseContinueListener);
  42. linear.addComponent(btnReverseContinue);
  43. }
  44. @Override
  45. public void onStart(Intent intent) {
  46. ...
  47. //添加功能按钮布局
  48. addComponents(layout, buttonBg);
  49. super.setUIContent(layout);
  50. }

复制

注册流转任务管理服务。

  1. // 注册流转任务管理服务
  2. private Component.ClickedListener mRegisterListener = new Component.ClickedListener() {
  3. @Override
  4. public void onClick(Component arg0) {
  5. HiLog.info(LABEL_LOG, "register call.");
  6. //增加过滤条件
  7. ExtraParams params = new ExtraParams();
  8. String[] devTypes = new String[]{ExtraParams.DEVICETYPE_SMART_PAD, ExtraParams.DEVICETYPE_SMART_PHONE};
  9. params.setDevType(devTypes);
  10. String jsonParams = "{'filter':{'commonFilter':{'system':{'harmonyVersion':'2.0.0'},'groupType':'1|256','curComType': 0x00030004,'faFilter':'{\"localVersionCode\":1,\"localMinCompatibleVersionCode\":2,\"targetBundleName\": \"com.xxx.yyy\"}'}},'transferScene':0,'remoteAuthenticationDescription': '拉起HiVision扫描弹框描述','remoteAuthenticationPicture':''}";
  11. params.setJsonParams(jsonParams);
  12. continuationRegisterManager.register(BUNDLE_NAME, params, callback, requestCallback);
  13. }
  14. };

复制

通过流转任务管理服务提供的showDeviceList()接口获取选择设备列表,用户选择设备后在IContinuationDeviceCallback回调中获取设备ID。

  1. // 显示设备列表,获取设备信息
  2. private ClickedListener mShowDeviceListListener = new ClickedListener() {
  3. @Override
  4. public void onClick(Component arg0) {
  5. // 设置过滤设备类型
  6. ExtraParams params = new ExtraParams();
  7. String[] devTypes = new String[]{ExtraParams.DEVICETYPE_SMART_PAD, ExtraParams.DEVICETYPE_SMART_PHONE};
  8. params.setDevType(devTypes);
  9. String jsonParams = "{'filter':{'commonFilter':{'system':{'harmonyVersion':'2.0.0'},'groupType':'1|256','curComType': 0x00030004,'faFilter':'{\"localVersionCode\":1,\"localMinCompatibleVersionCode\":2,\"targetBundleName\": \"com.xxx.yyy\"}'}},'transferScene':0,'remoteAuthenticationDescription': '拉起HiVision扫描弹框描述','remoteAuthenticationPicture':''}";
  10. params.setJsonParams(jsonParams);
  11. // 显示选择设备列表
  12. continuationRegisterManager.showDeviceList(abilityToken, params, null);
  13. }
  14. };

复制

可使用两种方法实现FA的迁移。

  • 方法一:直接迁移FA,迁移后不可回迁。
  • 方法二:迁移一个支持回迁的FA,迁移后还可将FA拉回到本端。

将运行时的FA迁移到目标设备,实现业务在设备间无缝迁移。

  1. // 跨端迁移FA
  2. private ClickedListener mContinueAbilityListener = new ClickedListener() {
  3. @Override
  4. public void onClick(Component arg0) {
  5. if (selectDeviceId != null) {
  6. // 用户点击后发起迁移流程
  7. continueAbility(selectDeviceId);
  8. }
  9. }
  10. };

复制

设置一个支持回迁FA的迁移功能按钮,以及拉回该FA的功能按钮。

  1. // 设置支持回迁FA的迁移按钮
  2. private Component.ClickedListener mContinueReversiblyListener = new Component.ClickedListener() {
  3. @Override
  4. public void onClick(Component arg0) {
  5. if (selectDeviceId != null) {
  6. // 用户选择设备后实现可拉回迁移
  7. continueAbilityReversibly(selectDeviceId);
  8. isReversibly = true;
  9. }
  10. }
  11. };
  12. // 设置拉回已迁移FA的按钮
  13. private Component.ClickedListener mReverseContinueListener = new Component.ClickedListener() {
  14. @Override
  15. public void onClick(Component arg0) {
  16. // 用户拉回迁移FA
  17. if (isReversibly) {
  18. reverseContinueAbility();
  19. isReversibly = false;
  20. }
  21. }
  22. };

复制

FA的迁移还涉及到状态数据的传递,需要实现IAbilityContinuation接口,供开发者实现迁移过程中特定事件的管理能力,代码示例如下:

  1. public class MainAbilitySlice extends AbilitySlice implements IAbilityContinuation {
  2. private void showMessage(String msg) {
  3. ToastDialog toastDialog = new ToastDialog(this);
  4. toastDialog.setText(msg);
  5. toastDialog.show();
  6. }
  7. @Override
  8. public boolean onStartContinuation() {
  9. showMessage("ContinueAbility Start");
  10. return true;
  11. }
  12. @Override
  13. public boolean onSaveData(IntentParams saveData) {
  14. String exampleData = String.valueOf(System.currentTimeMillis());
  15. saveData.setParam("continueParam", exampleData);
  16. return true;
  17. }
  18. @Override
  19. public boolean onRestoreData(IntentParams restoreData) {
  20. // 远端FA迁移传来的状态数据,开发者可以按照特定的场景对这些数据进行处理
  21. Object data = restoreData.getParam("continueParam");
  22. return true;
  23. }
  24. @Override
  25. public void onCompleteContinuation(int result) {
  26. // 开发者可以根据业务需要,提示用户迁移完成,关闭本端FA
  27. showMessage("ContinueAbility Done");
  28. if (!isReversibly) {
  29. terminateAbility();
  30. }
  31. }
  32. @Override
  33. public void onFailedContinuation(int errorCode) {
  34. // 开发者可以根据业务需要,提示用户迁移失败
  35. showMessage("ContinueAbility failed");
  36. if (!isReversibly) {
  37. terminateAbility();
  38. }
  39. }
  40. }

复制

通过自定义迁移事件相关的行为,最终实现对FA的迁移。此处主要以较为常用的两个事件,包括迁移发起端完成迁移的回调onCompleteContinuation(int result),以及接收到远端迁移行为传递数据的回调onRestoreData(IntentParams restoreData)。其他还包括用于本端迁移发起时保存状态数据的回调onSaveData(IntentParams saveData)和本端发起迁移的回调onStartContinuation()。按照实际应用自定义特定场景对应的回调,可以完成多种场景下FA的迁移任务。


最后,为了能让大家更好的去学习提升鸿蒙 (Harmony OS) 开发技术,小编连夜整理了一份30个G纯血版学习资料(含视频、电子书、学习文档等)以及一份在Github上持续爆火霸榜的《纯血版华为鸿蒙 (Harmony OS)开发手册》(共计890页),希望对大家有所帮助。

纯血版鸿蒙 HarmonyOS 4.0 视频学习资料

 需要以上视频学习资料小伙伴

请点击→纯血版全套鸿蒙HarmonyOS学习资料


《纯血版华为鸿蒙 (Harmony OS)开发手册》

这份手册涵盖了当前鸿蒙 (Harmony OS) 开发技术必掌握的核心知识点

纯血版鸿蒙 (Harmony OS)开发手册部分精彩内容

HarmonyOS 概念:

  • 系统定义
  • 技术架构
  • 技术特性
  • 系统安全

如何快速入门?

  • 基本概念
  • 构建第一个ArkTS应用
  • 构建第一个JS应用
  • ……


开发基础知识: 

  • 应用基础知识
  • 配置文件
  • 应用数据管理
  • 应用安全管理
  • 应用隐私保护
  • 三方应用调用管控机制
  • 资源分类与访问
  • 学习ArkTS语言
  • ……

基于ArkTS 开发:

  • Ability开发
  • UI开发
  • 公共事件与通知
  • 窗口管理
  • 媒体
  • 安全
  • 网络与链接
  • 电话服务
  • 数据管理
  • 后台任务(Background Task)管理
  • 设备管理
  • 设备使用信息统计
  • DFX
  • 国际化开发
  • 折叠屏系列
  • .……

获取以上文中提到的这份纯血版鸿蒙 (Harmony OS) 开发资料的小伙伴 

请点击→纯血版全套鸿蒙HarmonyOS学习资料


?写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing?,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新VIP学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

最新鸿蒙Next全套学习资料请扫码
微信名片
注:本文转载自blog.csdn.net的蜀道山QAQ的文章"https://blog.csdn.net/shudaoshanQAQ/article/details/135678165"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top