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

d7859d1bf754872c320ba1637b44a971.png

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

efa1dfb79768cfd5544be5dd474d2c6c.png

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

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

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

下面进入正题:

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

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

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

协同:在多个设备上同时运行同一个应用程序。用户在多个设备的支持下进行同一工作任务。

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

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

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

6b8d020b7f754df3b11312a8869347c5.png

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

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

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

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

那么什么是协同呢?

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

8f3773f887d57f0682b5aaaaf02a0954.png

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

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

2 应用程序流转的实现

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

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

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

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

具体的实现方法如下:

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

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

ab68ab11d7bdc3270a53028e04df5fcd.png

布局代码如下:

xmlns:ohos="http://schemas.huawei.com/res/ohos"

ohos:height="match_parent"

ohos:width="match_parent"

ohos:orientation="vertical">

ohos:id="$+id:btn_continue"

ohos:height="match_parent"

ohos:width="match_parent"

ohos:layout_alignment="horizontal_center"

ohos:text="迁移"

ohos:text_size="50"

/>

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

代码如下:

{

......

"module": {

......

"reqPermissions": [

{

"name":"ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"

},

{

"name":"ohos.permission.DISTRIBUTED_DATASYNC"

}

],

.....

}

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

publicclass MainAbility extends Ability implements IAbilityContinuation {

@Override

publicvoid 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 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

publicboolean onStartContinuation() {

returntrue;

}

@Override

publicboolean onSaveData(IntentParams intentParams) {

returntrue;

}

@Override

publicboolean onRestoreData(IntentParams intentParams) {

returntrue;

}

@Override

publicvoid onCompleteContinuation(inti) {

}

}

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

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

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

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

publicclass MainAbilitySlice extends AbilitySlice implements IAbilityContinuation {    @Override

publicvoid 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

publicvoid onClick(Component component) {

continueAbility(getAvailableDeviceIds().get(0));

}

});

}

@Override

publicvoid onActive() {

super.onActive();

}

@Override

publicvoid onForeground(Intent intent) {

super.onForeground(intent);

}

@Override

publicboolean onStartContinuation() {

returntrue;

}

@Override

publicboolean onSaveData(IntentParams intentParams) {

returntrue;

}

@Override

publicboolean onRestoreData(IntentParams intentParams) {

returntrue;

}

@Override

publicvoid onCompleteContinuation(inti) {

terminateAbility();

}

/**

* 获得所有已经连接的所有设备ID

* @return设备ID列表

*/

publicstaticList getAvailableDeviceIds() {

// 获得DeviceInfo列表,包含了已经连接的所有设备信息

List deviceInfoList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);

// 如果DeviceInfo列表为空则返回

if (deviceInfoList == null|| deviceInfoList.size() == 0) {

returnnull;

}

// 遍历DeviceInfo列表,获得所有的设备ID

List deviceIds = new ArrayList<>();

for(DeviceInfo deviceInfo : deviceInfoList) {

deviceIds.add(deviceInfo.getDeviceId());

}

// 返回所有的设备ID

returndeviceIds;

}

}

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

(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

93f64e8182a6cd8aebb35f6c391d1c32.png

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

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

【编辑推荐】

【责任编辑:jianghua TEL:(010)68476606】

点赞 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值