#2020征文-手机#【干货】鸿蒙应用程序流转的实现! 原创 精华
大家好!!欢迎您来到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界面,仅显示一个【流转】按钮。如图
布局代码如下:
<?xml version="1.0" encoding="utf-8"?> <DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:height="match_parent" ohos:width="match_parent" ohos:orientation="vertical"> <Button ohos:id="$+id:btn_continue" ohos:height="match_parent" ohos:width="match_parent" ohos:layout_alignment="horizontal_center" ohos:text="迁移" ohos:text_size="50" /> </DirectionalLayout>
然后在config.json中配置静态权限。
代码如下:
{
......
"module": {
......
"reqPermissions": [
{
"name": "ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"
},
{
"name": "ohos.permission.DISTRIBUTED_DATASYNC"
}
],
.....
}
在MainAbility.java中添加以下代码:
public class MainAbility extends Ability implements IAbilityContinuation { @Override public void onStart(Intent intent) { super.onStart(intent); super.setMainRoute(MainAbilitySlice.class.getName()); requestPermission(); } private void requestPermission() { String[] permission = { "ohos.permission.DISTRIBUTED_DATASYNC", "ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"}; List<String> applyPermissions = new ArrayList<>(); for (String element : permission) { if (verifySelfPermission(element) != 0) { if (canRequestPermission(element)) { applyPermissions.add(element); } else { } } else { } } requestPermissionsFromUser(applyPermissions.toArray(new String[0]), 0); } @Override public boolean onStartContinuation() { return true; } @Override public boolean onSaveData(IntentParams intentParams) { return true; } @Override public boolean onRestoreData(IntentParams intentParams) { return true; } @Override public void onCompleteContinuation(int i) { } }
这段代码中包括两个部分:
(1)通过requestPermission()方法动态申请权限。
(2)实现IAbilityContinuation接口,并重写其四个主要的方法。方法内容可以为空,因为承载界面的为AbilitySlice。
在MainAbilitySlice.java中添加以下代码:
public class MainAbilitySlice extends AbilitySlice implements IAbilityContinuation { @Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
Button btnContinue = (Button) findComponentById(ResourceTable.Id_btn_continue);
btnContinue.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
continueAbility(getAvailableDeviceIds().get(0));
}
});
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
@Override
public boolean onStartContinuation() {
return true;
}
@Override
public boolean onSaveData(IntentParams intentParams) {
return true;
}
@Override
public boolean onRestoreData(IntentParams intentParams) {
return true;
}
@Override
public void onCompleteContinuation(int i) {
terminateAbility();
}
/**
* 获得所有已经连接的所有设备ID
* @return 设备ID列表
*/
public static List<String> getAvailableDeviceIds() {
// 获得DeviceInfo列表,包含了已经连接的所有设备信息
List<DeviceInfo> deviceInfoList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
// 如果DeviceInfo列表为空则返回
if (deviceInfoList == null || deviceInfoList.size() == 0) {
return null;
}
// 遍历DeviceInfo列表,获得所有的设备ID
List<String> deviceIds = new ArrayList<>();
for (DeviceInfo deviceInfo : deviceInfoList) {
deviceIds.add(deviceInfo.getDeviceId());
}
// 返回所有的设备ID
return deviceIds;
}
}
这个代码中包括以下几个方面:
(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下,并且登录同一个华为账号,才可以使用分布式软总线实现流转。
你好,怎么开启多个模拟器?最新的HVD只能开启一个P40,即使想额外开启MatePad也会先关掉P40才能打开新的。
您好,目前DevEco Studio 2.0不支持双开远程模拟器,只能开1个。
如果您有一个真机,也无法和远程虚拟机组网。
因此,很不幸运的是目前只有一个解决方案:购买两个鸿蒙真机进行调试。/(ㄒoㄒ)/~~
===
不过,据说华为明年可能会推出本地可多开的虚拟机,可以再等等哈。
很棒啊,赞!
好吧,多谢回复
如果采用JS路线,如何实现这个功能呢?