PageAbility跨设备迁移开发实战—问答互动

系统
跨设备迁移是指将应用中的Page页迁移到另一设备中。可以同步应用数据,甚至可以在的不同设备间迁移,是HarmonyOS特色之一。于是,我以官方给了分布式邮件系统为例,写了一个简单的问答互动应用。

[[441035]]

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

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

https://harmonyos.51cto.com

跨设备迁移是指将应用中的Page页迁移到另一设备中。可以同步应用数据,甚至可以在的不同设备间迁移,是HarmonyOS特色之一。于是,我以官方给了分布式邮件系统为例,写了一个简单的问答互动应用。用户在设备A上提问,在设备B上回答,信息通过迁移传递,并且能查看问答记录。

Table of Contents

效果展示

#星光计划2.0# PageAbility跨设备迁移开发实战——问答互动-鸿蒙HarmonyOS技术社区

主要功能

实现问答界面,通过发送按钮将问题、答题等信息转递到另一设备上。

实现问题记录界面,对每个完整的问答进行记录,方便查看。

设备间的数据进行同步,拥有相同的问答记录。

迁移的主要步骤

  1. 设备A上的Page请求迁移。
  2. HarmonyOS处理迁移任务,并回调设备A上Page的保存数据方法,用于保存迁移必须的数据。
  3. HarmonyOS在设备B上启动同一个Page,并回调其恢复数据方法。

PageAbility实现迁移是需要实现IAbilityContinuation接口的,该接口如下:

  1. // 
  2. // Source code recreated from a .class file by IntelliJ IDEA 
  3. // (powered by FernFlower decompiler) 
  4. // 
  5.  
  6. package ohos.aafwk.ability; 
  7.  
  8. import ohos.aafwk.content.IntentParams; 
  9.  
  10. public interface IAbilityContinuation { 
  11.     int ERR_ABILITY_QUERY_FAILED = -2; 
  12.     int ERR_CONTINUE_TIMEOUT = -8; 
  13.     int ERR_DEVICE_OFFLINE = -9; 
  14.     int ERR_INSTALL_FREE_NOT_SUPPORTED = -4; 
  15.     int ERR_NETWORK_UNAVAILABLE = -3; 
  16.     int ERR_PARAMETER_INVALID = -6; 
  17.     int ERR_PERMISSION_DENIED = -5; 
  18.     int ERR_REMOTE_DEVICE_INCOMPATIBLE = -7; 
  19.     int ERR_UNKNOWN = -1; 
  20.     int SUCCESS = 0; 
  21.  
  22.     boolean onStartContinuation(); 
  23.  
  24.     boolean onSaveData(IntentParams var1); 
  25.  
  26.     boolean onRestoreData(IntentParams var1); 
  27.  
  28.     void onCompleteContinuation(int var1); 
  29.  
  30.     default void onRemoteTerminated() { 
  31.         throw new RuntimeException("Stub!"); 
  32.     } 
  33.  
  34.     default void onFailedContinuation(int errorCode) { 
  35.         throw new RuntimeException("Stub!"); 
  36.     } 

 除了一些异常码枚举外,都是迁移中需要用到的主要接口,onStartContinuation()是迁移开始前的预处理函数,可以在这加一些条件检测,提示等。但是在开始请求迁移前,需要申请权限ohos.permission.DISTRIBUTED_DATASYNC。config.json中的配置如下:

config.json

  1. "reqPermissions": [ 
  2.     { 
  3.         "name""ohos.permission.DISTRIBUTED_DATASYNC" 
  4.     } 

接下来只需要PageAbility实现Ability中的onRequestPermissionsFromUserResult接口,就能在启用迁移之前完成权限申请了。

  1. @Override 
  2. public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions, int[] grantResults) { 
  3.     if (permissions == null || permissions.length == 0 || grantResults == null || grantResults.length == 0) { 
  4.         return
  5.     } 
  6.     if (requestCode == 0) { 
  7.         if (grantResults[0] == IBundleManager.PERMISSION_DENIED) { 
  8.             terminateAbility(); 
  9.         } 
  10.     } 

完成权限申请后,只需要通过事件来触发迁移开关就行了。可以通过按钮的点击事件的来触发迁移开关continueAbility(),如下:

  1. private void initComponents() { 
  2.     questionTextField = (TextField) findComponentById(ResourceTable.Id_question_content); 
  3.  
  4.     answerTextField = (TextField) findComponentById(ResourceTable.Id_answer_content); 
  5.  
  6.     findComponentById(ResourceTable.Id_send_button).setClickedListener(this::migrateAbility); 
  7.     findComponentById(ResourceTable.Id_return_button).setClickedListener(component->terminate()); 
  8.  
  9. private void migrateAbility(Component component) { 
  10.     String questionSend = questionTextField.getText(); 
  11.     String answerSend = answerTextField.getText(); 
  12.     if (questionSend.isEmpty() && answerSend.isEmpty()) { 
  13.         new ToastDialog(this).setText("Text can not be null").show(); 
  14.         return
  15.     } 
  16.  
  17.     try { 
  18.         continueAbility(); 
  19.     } catch (IllegalStateException illegalStateException) { 
  20.         HiLog.error(LABEL_LOG, "%{public}s""migrateAbility: IllegalStateException"); 
  21.     } 

最重要的两个接口莫过于onSaveData、onRestoreData了,一个是在迁移的时候,将设备A的需要输入的数据存储,另一个是在设备B进行迁移时,恢复数据。

  1. @Override 
  2. public boolean onSaveData(IntentParams intentParams) { 
  3.     intentParams.setParam(QUESTION_KEY, questionTextField.getText()); 
  4.     intentParams.setParam(ANSWER_KEY, answerTextField.getText()); 
  5.  
  6.     return true
  7.  
  8. @Override 
  9. public boolean onRestoreData(IntentParams intentParams) { 
  10.     if (intentParams.getParam(QUESTION_KEY) instanceof String) { 
  11.         questionText = (String) intentParams.getParam(QUESTION_KEY); 
  12.     } 
  13.  
  14.     if (intentParams.getParam(ANSWER_KEY) instanceof String) { 
  15.         answerText = (String) intentParams.getParam(ANSWER_KEY); 
  16.     } 
  17.  
  18.     if (!questionText.isEmpty() && ! answerText.isEmpty()) { 
  19.         AskRecordSlice.UpdateContent("Q:" + questionText + "\n"); 
  20.         AskRecordSlice.UpdateContent("A:" + answerText + "\n"); 
  21.     } 
  22.  
  23.     return true

其中的IntentParams是迁移的数据包,提供了setParam、getParam,来传输Key-Value数据。

设备B上只要正常运行了onRestoreData后,那就会回调设备A上的onCompleteContinuation,表示迁移顺利完成,否则回调onFailedContinuation,通过捕捉异常码可进行异常处理。而我在正常迁移完成后,进行了问答记录的本地存储:

  1. @Override 
  2. public void onCompleteContinuation(int code) { 
  3.     questionText = questionTextField.getText(); 
  4.     answerText = answerTextField.getText(); 
  5.     if (!questionText.isEmpty() && ! answerText.isEmpty()) { 
  6.         AskRecordSlice.UpdateContent("Q:" + questionText + "\n"); 
  7.         AskRecordSlice.UpdateContent("A:" + answerText + "\n"); 
  8.     } 

 具体代码

由于目录树中文件较多,整个工程文件的git路径为:

https://gitee.com/baboon-chen/harmony-osexample.git

需要特殊注意的点:

  1. //1 跨不同设备时,需要在配置文件中添加上支持的设备类型 config.json 
  2. "deviceType": [ 
  3.       "phone"
  4.       "tablet" 
  5.     ], 
  6. //2 要实现接口的类有哪些? 
  7. 一个应用可能包含多个Page,都有自己的PageSlice栈。仅需要在支持迁移的Page中通过以下方法实现IAbilityContinuation接口。同时,此Page所包含的所有AbilitySlice也需要实现此接口。 

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

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

https://harmonyos.51cto.com

 

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

2021-08-12 10:02:08

鸿蒙HarmonyOS应用

2021-01-06 11:21:56

鸿蒙HarmonyOS应用开发

2021-06-16 15:18:03

鸿蒙HarmonyOS应用

2010-11-30 16:21:15

Exchange迁移

2020-11-05 10:05:25

App

2022-05-19 15:47:24

碰一碰连接设备开发鸿蒙

2021-08-13 13:53:23

鸿蒙HarmonyOS应用

2019-03-13 11:03:06

腾讯金融数据机房

2022-08-15 22:20:46

应用开发华为IoT平台

2021-11-03 09:51:45

鸿蒙HarmonyOS应用

2012-04-26 10:48:01

iOS开发互动广告

2014-12-08 10:31:45

华为

2011-03-09 10:21:35

2014-12-11 11:03:20

Qt跨平台开发

2022-08-15 22:09:37

设备开发开发笔记

2018-06-03 09:43:47

iOSAndroid谷歌

2021-08-17 10:20:14

鸿蒙HarmonyOS应用

2014-10-15 16:11:16

易信互动微访谈

2022-08-27 15:23:52

开发者大会谷歌Android 应用

2010-03-09 09:49:01

Oracle跨平台迁移
点赞
收藏

51CTO技术栈公众号