2020征文-手机【干货】鸿蒙应用程序流转的实现!

系统
这里我给大家介绍一下HarmonyOS应用程序流转的实现。

[[358967]]

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

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

https://harmonyos.51cto.com/#zz

大家好!!欢迎您来到51CTO鸿蒙专区。我是董昱。很荣幸成为HarmonyOS系统课程开发者。


这里我给大家介绍一下HarmonyOS应用程序流转的实现。

本文中的内容有视频版哦。在我在51CTO中首发了我的最新免费的视频教程《精讲鸿蒙应用程序开发》就有相关的内容。

欢迎大家观看,并提出宝贵的意见:https://edu.51cto.com/course/26138.html

下面进入正题:

1 什么是应用程序的协同和流转?

首先,什么是应用程序的流转和协同呢?

应用流转和协同是鸿蒙操作系统分布式的重要体现。这里面涉及两个概念:

  • 协同:在多个设备上同时运行同一个应用程序。用户在多个设备的支持下进行同一工作任务。
  • 流转:一个应用程序在某一个设备上运行时,因用户需要切换到到另外一个上继续运行,同时在原来的设备上停止运行。流转包括迁移(Migrate)和迁回两个层面。

如果文字上读起来困难的话,可以看看下面的例子:

如果我正在用设备A写邮件,但是设备A快没电了,我就可以将这个界面从设备A流转到设备B上,此时界面中我已经输入的邮件信息都没有丢失和变化。这个过程称为流转:

流转包括了迁移和迁回两个层面。

这个特性有点类似于苹果的应用接力,已经不是非常新鲜的事情了。但是鸿蒙的分布式特性还是存在两点特别的优势:

(1)苹果的应用接力开发非常繁琐。鸿蒙的流转却非常简单,易学。

(2)苹果设备的接力难以实现协同功能。

那么什么是协同呢?

例如,我用手机看新闻列表,用智慧屏浏览新闻。而手机上和智慧屏上都运行着同样一个应用程序,如下图所示。

这里要注意是同一个应用程序。这个协同过程借助于分布式软总线等关键技术是如丝般顺滑的,而且开发上非常简单。

在这里,先给大家演示以下流转的基本开发方法。

2 应用程序流转的实现

这主要包含了三个主要步骤:

(1)权限配置(包括动态权限和静态权限)

(2)在Ability和AbilitySlice中实现IAbilityContinuation接口。

(3)调用ContinueAbility()方法实现流转

具体的实现方法如下:

首先,我们创建一个空的手机Java工程。模板为:Empty Feature Ability (Java)。

让我们修改以下UI界面,仅显示一个【流转】按钮。如图

布局代码如下:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <DirectionalLayout 
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  4.     ohos:height="match_parent" 
  5.     ohos:width="match_parent" 
  6.     ohos:orientation="vertical"
  7.  
  8.     <Button 
  9.         ohos:id="$+id:btn_continue" 
  10.         ohos:height="match_parent" 
  11.         ohos:width="match_parent" 
  12.         ohos:layout_alignment="horizontal_center" 
  13.         ohos:text="迁移" 
  14.         ohos:text_size="50" 
  15.     /> 
  16.  
  17. </DirectionalLayout> 

然后在config.json中配置静态权限。

代码如下:

  1.   ...... 
  2.   "module": { 
  3.     ...... 
  4.     "reqPermissions": [ 
  5.       { 
  6.         "name""ohos.permission.GET_DISTRIBUTED_DEVICE_INFO" 
  7.       }, 
  8.       { 
  9.         "name""ohos.permission.DISTRIBUTED_DATASYNC" 
  10.       } 
  11.     ], 
  12.     ..... 

 在MainAbility.java中添加以下代码:

  1. public class MainAbility extends Ability implements IAbilityContinuation { 
  2.     @Override 
  3.     public void onStart(Intent intent) { 
  4.         super.onStart(intent); 
  5.         super.setMainRoute(MainAbilitySlice.class.getName()); 
  6.         requestPermission(); 
  7.     } 
  8.  
  9.     private void requestPermission() { 
  10.         String[] permission = { 
  11.                 "ohos.permission.DISTRIBUTED_DATASYNC"
  12.                 "ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"}; 
  13.         List<String> applyPermissions = new ArrayList<>(); 
  14.         for (String element : permission) { 
  15.             if (verifySelfPermission(element) != 0) { 
  16.                 if (canRequestPermission(element)) { 
  17.                     applyPermissions.add(element); 
  18.                 } else { 
  19.                 } 
  20.             } else { 
  21.             } 
  22.         } 
  23.         requestPermissionsFromUser(applyPermissions.toArray(new String[0]), 0); 
  24.     } 
  25.  
  26.     @Override 
  27.     public boolean onStartContinuation() { 
  28.         return true
  29.     } 
  30.  
  31.     @Override 
  32.     public boolean onSaveData(IntentParams intentParams) { 
  33.         return true
  34.     } 
  35.  
  36.     @Override 
  37.     public boolean onRestoreData(IntentParams intentParams) { 
  38.         return true
  39.     } 
  40.  
  41.     @Override 
  42.     public void onCompleteContinuation(int i) { 
  43.  
  44.     } 

 这段代码中包括两个部分:

(1)通过requestPermission()方法动态申请权限。

(2)实现IAbilityContinuation接口,并重写其四个主要的方法。方法内容可以为空,因为承载界面的为AbilitySlice。

在MainAbilitySlice.java中添加以下代码:

  1. public class MainAbilitySlice extends AbilitySlice implements IAbilityContinuation {    @Override 
  2.     public void onStart(Intent intent) { 
  3.         super.onStart(intent); 
  4.         super.setUIContent(ResourceTable.Layout_ability_main); 
  5.  
  6.         Button btnContinue = (Button) findComponentById(ResourceTable.Id_btn_continue); 
  7.         btnContinue.setClickedListener(new Component.ClickedListener() { 
  8.             @Override 
  9.             public void onClick(Component component) { 
  10.                 continueAbility(getAvailableDeviceIds().get(0)); 
  11.             } 
  12.         }); 
  13.     } 
  14.  
  15.     @Override 
  16.     public void onActive() { 
  17.         super.onActive(); 
  18.     } 
  19.  
  20.     @Override 
  21.     public void onForeground(Intent intent) { 
  22.         super.onForeground(intent); 
  23.     } 
  24.  
  25.     @Override 
  26.     public boolean onStartContinuation() { 
  27.         return true
  28.     } 
  29.  
  30.     @Override 
  31.     public boolean onSaveData(IntentParams intentParams) { 
  32.         return true
  33.     } 
  34.  
  35.     @Override 
  36.     public boolean onRestoreData(IntentParams intentParams) { 
  37.         return true
  38.     } 
  39.  
  40.     @Override 
  41.     public void onCompleteContinuation(int i) { 
  42.         terminateAbility(); 
  43.     } 
  44.  
  45.     /** 
  46.      * 获得所有已经连接的所有设备ID 
  47.      * @return 设备ID列表 
  48.      */ 
  49.     public static List<String> getAvailableDeviceIds() { 
  50.         // 获得DeviceInfo列表,包含了已经连接的所有设备信息 
  51.         List<DeviceInfo> deviceInfoList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE); 
  52.         // 如果DeviceInfo列表为空则返回 
  53.         if (deviceInfoList == null || deviceInfoList.size() == 0) { 
  54.             return null
  55.         } 
  56.         // 遍历DeviceInfo列表,获得所有的设备ID 
  57.         List<String> deviceIds = new ArrayList<>(); 
  58.         for (DeviceInfo deviceInfo : deviceInfoList) { 
  59.             deviceIds.add(deviceInfo.getDeviceId()); 
  60.         } 
  61.         // 返回所有的设备ID 
  62.         return deviceIds; 
  63.     } 
  64.  

 这个代码中包括以下几个方面:

(1)通过getAvailableDeviceIds()获取周围可以流转应用程序的设备ID列表。

(2)通过continueAbility()方法进行设备流转

(3)在onSaveData()和onRestoreData()方法中可以将界面中的数据流转出去。数据的流转大家可以观看我的视频教程哦,里面有详细的叙述:https://edu.51cto.com/course/26138.html?hm(在第5章的第1讲)

(4)在onCompleteContinuation()方法中调用termiateAbility()方法结束原先设备上的应用程序。

最后,在两个搭载鸿蒙操作系统的手机上均安装这个程序,并在其中一个设备上打开的该应用程序:单击【Continue】按钮就可以实现应用程序在两个设备间的流转了。

具体的演示大家可以观看的视频教程哦(在第5章的第1讲)!免费哒!

https://edu.51cto.com/course/26138.html?hm


不过,这两个设备需要在同一个WiFi下,并且登录同一个华为账号,才可以使用分布式软总线实现流转。

©著作权归作者和HarmonyOS技术社区共同所有,如需转载,请注明出处,否则将追究法律责任

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

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

https://harmonyos.51cto.com/#zz

 

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

2020-12-28 10:15:18

鸿蒙HarmonyOSListContain

2020-12-22 11:09:20

鸿蒙Feature AbiAbilitySlic

2020-12-14 11:44:29

开发js智能手表wearablewea

2020-12-23 11:24:34

鸿蒙开发IDE安装

2020-12-09 11:53:24

鸿蒙开发HelloWord

2020-12-28 11:19:06

鸿蒙HarmonyOSPage Abilit

2010-03-04 16:21:15

Android Mar

2011-09-05 10:27:02

Sencha Touc手机应用Android

2020-12-22 11:20:36

鸿蒙HarmonyOS游戏

2020-12-23 11:45:27

鸿蒙HarmonyOSTextField组件

2019-11-08 10:00:09

Windows手机应用程序

2020-12-17 12:06:49

鸿蒙应用鸿蒙开发

2020-12-04 12:42:59

组件鸿蒙Text

2020-11-05 11:47:52

HarmonyOS

2018-10-25 15:13:23

APP脱壳工具

2020-12-28 11:30:07

鸿蒙HarmonyOS分布式

2010-03-01 16:04:13

Linux Hadoo

2011-11-30 21:56:31

ibmdwXPathPHP

2010-12-27 17:04:07

应用程序版本升级

2011-08-05 13:49:53

iPhone 应用 开发
点赞
收藏

51CTO技术栈公众号