gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 30 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章PageAbility跨设备迁移开发实战—问答互动由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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 。

最后此篇关于PageAbility跨设备迁移开发实战—问答互动的文章就讲到这里了,如果你想了解更多关于PageAbility跨设备迁移开发实战—问答互动的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com