孰湖—基于PA的跨设备迁移功能及PageAbility代码示例工程完全解 原创 精华

Der_带鱼
发布于 2021-8-2 22:11
浏览
4收藏

孰湖—基于HarmonyOS PA的跨设备迁移功能及PageAbility代码示例工程完全解析

时间:2021年8月2日20:11:24

一、跨设备迁移

  • 是什么:是一种基于Ability框架下的Page Ability的能力

  • 迁移动作主要步骤:

    • 源侧设备上的Page请求迁移
    • 源侧设备回调保存数据方法
    • 目标侧设备启动Page,回调恢复数据方法
  • 请求迁移的两种方法

    • continue Ability()
    • continueAbilityReversibly()

区别在于:continueAbility()不能进行回迁,continueAbilityReversibly()可以进行回迁

  • 实现IAbilityContinuation接口

    • onStartContinuation()
    • onSaveData()
    • onRestoreData()
    • onCompleteContinuation()
    • onFailedContinuation()
    • onRemoteTerminated()

文字描述不够清晰和直接,故用表的形式进行输出

孰湖—基于PA的跨设备迁移功能及PageAbility代码示例工程完全解-鸿蒙开发者社区

  • A作为源侧向目标侧B进行迁移其回调方法的顺序是:

孰湖—基于PA的跨设备迁移功能及PageAbility代码示例工程完全解-鸿蒙开发者社区

二、PageAbility代码示例工程

  • 本示例演示了同一Page Ability内和不同Page间的AbilitySlice导航,以及Page Ability的跨端迁移。

(一)项目演示

因为示例代码的字真的小得让人眼瞎,所以就调大了一点

孰湖—基于PA的跨设备迁移功能及PageAbility代码示例工程完全解-鸿蒙开发者社区

孰湖—基于PA的跨设备迁移功能及PageAbility代码示例工程完全解-鸿蒙开发者社区

孰湖—基于PA的跨设备迁移功能及PageAbility代码示例工程完全解-鸿蒙开发者社区

  • 跨设备迁移

孰湖—基于PA的跨设备迁移功能及PageAbility代码示例工程完全解-鸿蒙开发者社区

  • 同PA不同Page间的导航

孰湖—基于PA的跨设备迁移功能及PageAbility代码示例工程完全解-鸿蒙开发者社区

(二)工程目录及其Slice直接的关系

孰湖—基于PA的跨设备迁移功能及PageAbility代码示例工程完全解-鸿蒙开发者社区

孰湖—基于PA的跨设备迁移功能及PageAbility代码示例工程完全解-鸿蒙开发者社区

(三)同一PA导航与不同Page

  • 同Page

  • Page内的AbilitySlice实例是以堆栈存放的,其页内导航的数据传递是通过intent传递的,源页面调用方法setParam(),其值是键值对。在跳转页面通过getParam进行接收(intent.getParam(key:“XX”))

  • 目标页面向源页面传递数据,构建intent实例(返回数据的载体)-赋值给intent类型的resultIntent变量-调用方法setParam()(键值对的形式)-调用方法setResult()指定实例作为参数-在原页面调用PresentForResult()(请求码非负整数作为第三个参数用于标识某一次页面导航)-重写方法onResult(处理返回数据)-

  • 不同Page

    • 显式:在触发事件中构造Intent.OperationBuilder的实例-分别链式调用
    Operation operation=new Intent.OperationBuilder()
    withBundleName(getBundleName())
          .getAbilityName(目标Ability.class.getName())
          .build();
    
    • 为了把目标Page的包名和类名都封装在需要传递的Intent类型的实例navigation中,需要调用navigation的方法setOperation并指定才创建的Intent类型的实例operation为其参数。最后用startAbility且把navigation作为参数。
    • 从目标页面跳转到源页面且处理数据,需要在目标调用getAbility.setParam并设置响应码(是用来标识一次响应)。之后在原页面把startAbility变更为startAbilityForResult(响应码)-把回调方法onResult替换为onAbilityResult(响应码),

孰湖—基于PA的跨设备迁移功能及PageAbility代码示例工程完全解-鸿蒙开发者社区

(四)跨设备迁移

  1. 设备A上的Page请求迁移。
  2. 系统回调设备A上Page及其AbilitySlice栈中所有AbilitySlice实例的IAbilityContinuation.onStartContinuation()方法,以确认当前是否可以立即迁移。
  3. 如果可以立即迁移,则系统回调设备A上Page及其AbilitySlice栈中所有AbilitySlice实例的IAbilityContinuation.onSaveData()方法,以便保存迁移后恢复状态必须的数据。
  4. 如果保存数据成功,则系统在设备B上启动同一个Page,并恢复AbilitySlice栈,然后回调IAbilityContinuation.onRestoreData()方法,传递此前保存的数据;此后设备B上此Page从onStart()开始其生命周期回调。
  5. 系统回调设备A上Page及其AbilitySlice栈中所有AbilitySlice实例的IAbilityContinuation.onCompleteContinuation()方法,通知数据恢复成功与否。
  6. 迁移过程中发生异常,系统回调设备A上Page及其AbilitySlice栈中所有AbilitySlice实例的IAbilityContinuation.onFailedContinuation()方法,通知迁移过程中发生异常,并不是所有异常都会回调FA此方法,仅局限于该接口枚举的异常。

孰湖—基于PA的跨设备迁移功能及PageAbility代码示例工程完全解-鸿蒙开发者社区

总结

  • 跨设备迁移是基于分布式流转操作的。是很有趣和很值得研究的功能
  • 同Page,不同Page,不同设备。三种情况下Page生命周期需要搞懂,需要分清楚Page生命周期回调方法,与跨设备迁移中实现IAbilityContinuation接口的回调方法。一定注意源侧与目标侧的方法调用的顺序。
  • 对于基础的Ability与Slice的关系、Slice与Layout(xml)的关系、Intent的理解得到了提升。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
7
收藏 4
回复
举报
3条回复
按时间正序
/
按时间倒序
mb609898e2cfb86
mb609898e2cfb86

已经完全不认识楼主开头的词是什么了。

1
回复
2021-8-3 10:19:12
Der_带鱼
Der_带鱼 回复了 mb609898e2cfb86
已经完全不认识楼主开头的词是什么了。

哈哈哈哈 山海经异兽!关于代码示例工程的解析全用山海经!其他的用的声律启蒙

回复
2021-8-3 11:21:52
鸿联
鸿联

期待楼主的山海经神兽系列

回复
2021-8-3 21:05:16
回复
    相关推荐