HarmonyOS Sample 之 AbilityInteraction设备迁移

系统 OpenHarmony
本示例演示了Feature Ability的基本交互和跨设备迁移的功能。在终端A随机生成一个数字,并计算这个数的平方值,然后将这个数传递给终端B,在终端B中同样计算出结果。

[[417820]]

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

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

https://harmonyos.51cto.com

AbilityInteraction设备迁移

介绍

本示例演示了Feature Ability的基本交互和跨设备迁移的功能。

在终端A随机生成一个数字,并计算这个数的平方值,然后将这个数传递给终端B,在终端B中同样计算出结果。

效果展示

搭建环境

安装DevEco Studio,详情请参考DevEco Studio下载

设置DevEco Studio开发环境,DevEco Studio开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用,可以根据如下两种情况来配置开发环境:

如果可以直接访问Internet,只需进行下载HarmonyOS SDK操作。

如果网络不能直接访问Internet,需要通过代理服务器才可以访问,请参考配置开发环境

实现步骤

1.config.json声明使用跨设备迁移的权限

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

2.Ability实现IAbilityContinuation接口及相关方法

  1. public class FirstAbility extends Ability implements IAbilityContinuation { 
  2.     ... 

3.Ability中申请用户对敏感权限授权

  1. @Override 
  2. public void onStart(Intent intent) { 
  3.     super.onStart(intent); 
  4.     super.setMainRoute(FirstAbilitySlice.class.getName()); 
  5.     requestPermission(); 
  6.  
  7. private void requestPermission() { 
  8.     if (verifySelfPermission(SystemPermission.DISTRIBUTED_DATASYNC) != IBundleManager.PERMISSION_GRANTED) { 
  9.         requestPermissionsFromUser(new String[] {SystemPermission.DISTRIBUTED_DATASYNC}, 0); 
  10.     } 

4.Ablity中下面几个方法全部返回true

  1. @Override 
  2. public boolean onStartContinuation() { 
  3.     return true
  4.  
  5. @Override 
  6. public boolean onSaveData(IntentParams intentParams) { 
  7.     return true
  8.  
  9. @Override 
  10. public boolean onRestoreData(IntentParams intentParams) { 
  11.     return true
  12.  
  13. @Override 
  14. public void onCompleteContinuation(int i) { 
  15.     terminateAbility(); 

5.Slice实现IAbilityContinuation接口及相关方法

  1. public class FirstAbilitySlice extends AbilitySlice implements LifecycleStateObserver, IAbilityContinuation { 
  2.     ... 

6.Slice按钮事件监听

  1. private void initComponents() { 
  2.     findComponentById(ResourceTable.Id_enter_second).setClickedListener(component -> startSecondAbility()); 
  3.     findComponentById(ResourceTable.Id_continue_ability).setClickedListener(component -> startContinue()); 
  4.     numberText = (Text) findComponentById(ResourceTable.Id_number); 
  5.     lifecycleState = (Text) findComponentById(ResourceTable.Id_lifecycle_state); 

7.Slice中实现设备迁移的方法

  1. private void startContinue() { 
  2.     try { 
  3.         continueAbility(); 
  4.     } catch (IllegalStateException | UnsupportedOperationException e) { 
  5.         LogUtil.error(TAG, "startContinue Exception "); 
  6.     } 

8.Slice中实现一下几个方法,返回true

  1. @Override 
  2. public boolean onStartContinuation() { 
  3.     return true
  4.  
  5. @Override 
  6. public boolean onSaveData(IntentParams intentParams) { 
  7.  
  8.     //设置设备迁移后需要恢复的数据 
  9.     intentParams.setParam(CONTINUE_PARAM_KEY_INPUT, inputNum); 
  10.     return true
  11.  
  12. @Override 
  13. public boolean onRestoreData(IntentParams intentParams) { 
  14.     //恢复数据 
  15.     Object object = intentParams.getParam(CONTINUE_PARAM_KEY_INPUT); 
  16.     if (object instanceof Long) { 
  17.         inputNum = (long) object; 
  18.     } 
  19.     return true
  20.  
  21. @Override 
  22. public void onCompleteContinuation(int i) { 
  23.     //设备迁移完成,关闭Slice 
  24.     terminate(); 

问题总结

1.Slice中获取bundleName:getBundleName()

2.Slice中获取Ability:getAbility()

3.如果想监听Ability/Slice的生命周期变化,可以实现LifecycleStateObserver接口,实现onStateChanged方法

  1. public class FirstAbilitySlice extends AbilitySlice implements LifecycleStateObserver{ 
  2.     ... 
  3.  
  4. @Override 
  5. public void onStateChanged(Lifecycle.Event event, Intent intent) { 
  6.     lifecycleState.setText(lifecycleState.getText() + System.lineSeparator() + event.name()); 

4.Slice中启动另外一个Ability的方法也可以用setElement

  1. private void startSecondAbility() { 
  2.     Intent intent = new Intent(); 
  3.     intent.setElement(new ElementName("", getBundleName(), SecondAbility.class.getName())); 
  4.     intent.setParam(Const.MESSAGE_KEY_SQUARED, inputNum); 
  5.     startAbilityForResult(intent, REQUEST_CODE_TO_ABILITY_B); 

5.Slice中在onAbilityResult方法中处理其它Abilty返回的结果

  1. /** 
  2.  * 
  3.  * @param requestCode  发出的请求码,用来识别是自己的请求 
  4.  * @param resultCode   收到的结果码,用来校验对端的结果 
  5.  * @param resultData   返回的数据 
  6.  */ 
  7. @Override 
  8. protected void onAbilityResult(int requestCode, int resultCode, Intent resultData) { 
  9.  
  10.     //使用switch逻辑语句判断 
  11.     switch (requestCode) { 
  12.  
  13.         //是自己发出去的请求码 
  14.         case REQUEST_CODE_TO_ABILITY_B: 
  15.             //是双方约定的结果码 
  16.             if (resultCode == Const.RESULT_CODE_FROM_ABILITY_B) { 
  17.                 //根据key获取指定类型的参数 
  18.                 long outputNum = resultData.getLongParam(Const.MESSAGE_KEY_SQUARED, 0); 
  19.                  
  20.                 numberText.setText(String.valueOf(outputNum)); 
  21.             } 
  22.             break; 
  23.         default
  24.             break; 
  25.     } 

文章相关附件可以点击下面的原文链接前往下载

AbilityInteraction.zip

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

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

https://harmonyos.51cto.com

 

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

2021-07-08 09:42:04

鸿蒙HarmonyOS应用

2021-09-15 14:55:49

鸿蒙HarmonyOS应用

2021-09-17 14:43:54

鸿蒙HarmonyOS应用

2021-09-24 09:25:01

鸿蒙HarmonyOS应用

2021-11-23 09:58:35

鸿蒙HarmonyOS应用

2021-09-22 09:42:41

鸿蒙HarmonyOS应用

2021-11-02 10:10:49

鸿蒙HarmonyOS应用

2021-06-16 15:18:03

鸿蒙HarmonyOS应用

2021-07-29 14:03:35

鸿蒙HarmonyOS应用

2021-11-03 09:51:45

鸿蒙HarmonyOS应用

2021-11-30 14:51:11

鸿蒙HarmonyOS应用

2021-12-10 15:06:56

鸿蒙HarmonyOS应用

2021-12-02 10:11:44

鸿蒙HarmonyOS应用

2021-08-24 15:13:06

鸿蒙HarmonyOS应用

2022-05-19 15:40:37

配网开发设备开发

2022-05-19 15:33:42

JS通信接口鸿蒙

2022-11-18 15:42:36

2022-06-09 14:08:34

多设备协同鸿蒙

2022-05-19 15:47:24

碰一碰连接设备开发鸿蒙

2021-08-24 09:49:15

鸿蒙HarmonyOS应用
点赞
收藏

51CTO技术栈公众号