服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - 编程技术 - PageAbility跨设备迁移开发实战—问答互动

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

2021-12-21 22:42鸿蒙社区拓维云创_ch 编程技术

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

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

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

Table of Contents

效果展示

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

主要功能

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

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

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

迁移的主要步骤

  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. package ohos.aafwk.ability;
  6. import ohos.aafwk.content.IntentParams;
  7. public interface IAbilityContinuation {
  8. int ERR_ABILITY_QUERY_FAILED = -2;
  9. int ERR_CONTINUE_TIMEOUT = -8;
  10. int ERR_DEVICE_OFFLINE = -9;
  11. int ERR_INSTALL_FREE_NOT_SUPPORTED = -4;
  12. int ERR_NETWORK_UNAVAILABLE = -3;
  13. int ERR_PARAMETER_INVALID = -6;
  14. int ERR_PERMISSION_DENIED = -5;
  15. int ERR_REMOTE_DEVICE_INCOMPATIBLE = -7;
  16. int ERR_UNKNOWN = -1;
  17. int SUCCESS = 0;
  18. boolean onStartContinuation();
  19. boolean onSaveData(IntentParams var1);
  20. boolean onRestoreData(IntentParams var1);
  21. void onCompleteContinuation(int var1);
  22. default void onRemoteTerminated() {
  23. throw new RuntimeException("Stub!");
  24. }
  25. default void onFailedContinuation(int errorCode) {
  26. throw new RuntimeException("Stub!");
  27. }
  28. }

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

config.json

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

接下来只需要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. }
  11. }

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

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

最重要的两个接口莫过于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. return true;
  6. }
  7. @Override
  8. public boolean onRestoreData(IntentParams intentParams) {
  9. if (intentParams.getParam(QUESTION_KEY) instanceof String) {
  10. questionText = (String) intentParams.getParam(QUESTION_KEY);
  11. }
  12. if (intentParams.getParam(ANSWER_KEY) instanceof String) {
  13. answerText = (String) intentParams.getParam(ANSWER_KEY);
  14. }
  15. if (!questionText.isEmpty() && ! answerText.isEmpty()) {
  16. AskRecordSlice.UpdateContent("Q:" + questionText + "\n");
  17. AskRecordSlice.UpdateContent("A:" + answerText + "\n");
  18. }
  19. return true;
  20. }

其中的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. }
  9. }

具体代码

由于目录树中文件较多,整个工程文件的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也需要实现此接口。

原文链接:https://harmonyos.51cto.com

延伸 · 阅读

精彩推荐
  • 编程技术2021年值得关注的React PDF 库

    2021年值得关注的React PDF 库

    今天,许多网络应用程序为其用户提供内置的PDF浏览选项。然而,选择一个并不容易,因为它们的功能远远超过显示PDF。在这篇文章中,我将评估5个React的...

    TianTianUp5232021-06-21
  • 编程技术Delphi - Indy idMessage和idSMTP实现邮件的发送

    Delphi - Indy idMessage和idSMTP实现邮件的发送

    这篇文章主要介绍了Delphi - Indy idMessage和idSMTP实现邮件的发送,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...

    JJ_JeremyWu6592020-09-22
  • 编程技术让开发效率倍增的 VS Code 插件

    让开发效率倍增的 VS Code 插件

    今天来分享一些提升开发效率的实用 VS Code 插件!Better Comments 扩展可以帮助我们在代码中创建更人性化的注释,有不同形式和颜色的注释供我们选择。 ...

    前端充电宝7132022-04-21
  • 编程技术从Context源码实现谈React性能优化

    从Context源码实现谈React性能优化

    这篇文章主要介绍Context的实现原理,源码层面掌握React组件的render时机,从而写出高性能的React组件,源码层面了解shouldComponentUpdate、React.memo、PureComponen...

    魔术师卡颂5312020-12-20
  • 编程技术AIOps,SRE工程师手中的利器

    AIOps,SRE工程师手中的利器

    AIOps开始成为一种极为重要的站点可靠性工程工具。它能够高效吸纳观察数据、参与数据以及来自第三方工具的数据,判断系统运行状态并保证其处于最佳...

    至顶网5972021-03-08
  • 编程技术真正聪明的程序员,总有办法不加班

    真正聪明的程序员,总有办法不加班

    工作效率提升了,就可以少加班了,聪明的程序员,总会有一堆可以提升编码效率的工具?当一种工具满足不了工作需求,就去探索新的,今天纬小创就给...

    今日头条12482021-03-04
  • 编程技术用户态 Tcpdump 如何实现抓到内核网络包的?

    用户态 Tcpdump 如何实现抓到内核网络包的?

    在网络包的发送和接收过程中,绝大部分的工作都是在内核态完成的。那么问题来了,我们常用的运行在用户态的程序 tcpdump 是那如何实现抓到内核态的包...

    开发内功修炼11612021-09-08
  • 编程技术简单、好懂的Svelte实现原理

    简单、好懂的Svelte实现原理

    本文会围绕一张流程图和两个Demo讲解,正确的食用方式是用电脑打开本文,跟着流程图、Demo一边看、一边敲、一边学...

    魔术师卡颂4822021-11-10