6

展现鸿蒙的独特魅力:跨设备调用窗口(Page Ability)

 3 years ago
source link: https://blog.csdn.net/nokiaguy/article/details/111940393
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
展现鸿蒙的独特魅力:跨设备调用窗口(Page Ability)_李宁的极客世界bgJBm&nku$q$-CSDN博客

为了让更多的人看到本文,请各位同学动动小手,点击右上角【...】,将本文分享到朋友圈,thanks! 

HarmonyOS的核心特性(或称为卖点)之一就是软总线技术,而Page Ability的跨设备迁移是软总线的一个具体技术实现。所谓跨设备迁移Page Ability,是指设备A中的特定App调用设备B中该App的Page Ability。这有一个前提,就是设备A和设备B都安装了同一个App。如果B设备没有安装App,B设备就会自动从华为应用商店下载这个App,当然,这一过程是完全静默的。下载完后,就会自动启动相应的Page Ability。这种技术不仅可以启动另一个设备上的Page Ability,还可以向另一个设备中的Page Ability传递数据。

这种技术的一个主要应用场景是,可以将在设备A上完成了一半的工作,迁移到设备B上继续完成。例如,在家中平板电脑上要回一封EMail,但临时有急事,需要出门,这时可以将在平板电脑上写了一半的EMail迁移到手机上,需要在路上完成剩下的工作。

1.  跨设备迁移前的准备工作

在进行跨设备迁移之前,需要为HarmonyOS设备做一下准备:

(1) 打开HarmonyOS设备中的蓝牙;

(2)HarmonyOS设备需要连入Wi-Fi,而且多个HarmonyOS需要在同一个网段;

(3)多个HarmonyOS设备需要用同一个华为开发者账号登录,如图1所示。

format,png

     图1 用同一个华为开发者账号登录

(4)点击“设置”>“更多连接”>“多设备协同”,进入多设备协同窗口,打开多设备协同开关,如图2所示。

format,png

                         图2 多设备协同

(5)修改HarmonyOS设备名。点击“设置”>“蓝牙”>“设备名称”,进入设备名称窗口,输入一个新的什么名称,如图3所示。尽管这一步不是必须的,但如果拥有多部HarmonyOS设备,可能很多HarmonyOS设备的名称是相同或相近的。为了更好区分不同的HarmonyOS设备,建议修改HarmonyOS设备名称。

format,png

            图3  修改HarmonyOS设备名称

2   获取设备列表

跨设备迁移是通过设备ID来区分不同设备的,所以首先要获取所有可用的设备的ID。获取设备ID需要调用DeviceManager.getDeviceList方法,该方法返回一个List对象,类型是DeviceInfo,用来描述设备的相关信息,包括设备ID、设备名称(就是上一节设置的设备名称)等。实现代码如下:

getDeviceList方法有一个参数,是一个int类型的值,表示获取什么状态的设备的信息。可以指定的值如下:

  • DeviceInfo.FLAG_GET_ONLINE_DEVICE:获取所有在线设备的信息;

  • DeviceInfo. FLAG_GET_OFFLINE_DEVICE:获取所有离线设备的信息;

  • DeviceInfo. FLAG_GET_ALL_DEVICE:获取所有设备的信息;

通常会使用第1个值,获取所有在线设备的信息,因为只有设备在线,才能将Page Ability迁移到该设备上。

下面给出一个案例,该案例实现了一个通用的显示可用设备列表的Page Ability,点击某一个设备,会返回该设备的ID,

在device_ids.xml布局文件中放置了一个ListContainer组件,用于显示获取的所有可用设备的相关信息。实现代码如下:

在DeviceIdsAbility类中为ListContainer组件装载列表项时,在getComponent方法中利用了第2个参数component,该参数就是列表项的根视图。如果component为null,表明并没有可以利用的列表项视图,所以要创建一个新的列表项视图。如果不为null,表明可以利用其他的还没有显示的列表项视图,只需要替换该视图的Text组件中显示的信息即可。

最后在config.json文件中添加一些与分布式相关的权限。

运行程序,会看到如图4所示的设备列表。

format,png

           图4 获取可用设备的ID

要注意的是,通过DeviceManager.getDeviceList方法只能获取其他设备的信息,不能获取自身的信息,例如,有设备A、设备B和设备C。在设备A中只能获取设备B和设备C的信息,而不能获取设备A的信息。在设备B和设备C中的表现也类似。

3 根据设备ID调用Page Ability

一个Page Ability要想跨设备访问,必须实现IAbilityContinuation接口,否则会抛出异常。该接口必须实现的有4个方法,他们的含义如下:

假设在设备A上将Page Ability迁移到设备B。onStartContinuation方法和onSaveData方法是在设备A上被调用的,而onRestoreData方法和onCompleteContinuation方法是在设备B上被调用的。为了迁移Page Ability,需要在设备A上执行下面的代码:

continueAbility(deviceId);

其中deviceID是设备ID。当调用该方法后,在设备A上就会依次调用onStartContinuation方法和onSaveData方法,在设备B上会依次调用onRestoreData方法和onCompleteContinuation方法。其中onSaveData方法和onRestoreData方法都有一个IntentParams类型的参数,通过该参数可以在设备A和设备B之间通过Page Ability传递数据(使用方式与Intent类似)。通常在onRestoreData方法中恢复Page Ability从设备A上迁移到设备B上时的数据。

下面给出一个实际的案例,在Page Ability上放置了一个TextField组件,并在该组件中输入了一些文本,然后点击按钮,将该Page Ability迁移到另一部HarmonyOS手机上,并恢复迁移时的数据。

实现代码如下:

阅读这段代码,需要了解下面几点:

  • 要想成功迁移Page Ability,并成功传递数据。onStartContinuation方法、onSaveData方法和onRestoreData方法都必须返回true,如果读者使用IDE的自动生成代码功能,默认这几个方法都会返回false,请将他们的返回值改成true;

  • 在HarmonyOS中有一些权限,并不是在config.json中声明就可以了,还需要使用Java代码申请,例如,Page Ability跨设备迁移就需要使用Java代码申请ohos.permission.DISTRIBUTED_DATASYNC权限。如果是第一次申请,会弹出如图5的授权对话框,点击“始终允许”按钮关闭该对话框,第2次申请权限,就不会弹出该对话框了;

  • 由于onRestoreData方法在onStart方法之前调用,所以不能直接在onRestoreData方法中使用组件对象,因为组件对象通常都是在onStart方法中创建的。所以在onRestoreData方法被调用时,这些组件对象还都是空。正确的做法是在onRestoreData方法中将要恢复的数据保存到成员变量中,然后在onStart方法中创建完组件对象后,用这些变量恢复组件中的数据。

  • 本例考虑了多部HarmonyOS设备迁移的问题,所以使用了上一节编写的设备列表窗口。在开始跨设备迁移Page Ability之前,会先弹出一个设备列表窗口,当用户选择一个设备后,会返回该设备的ID,然后在onAbilityResult方法中获取这个返回的设备ID,最后使用continueAbility方法迁移Page Ability; 

format,png

                  图5 授权对话框

现在运行程序,关闭授权对话框,并在TextField组件中输入一些内容,最后点击“跨设备迁移Page Ability”按钮,会弹出一个设备列表窗口,选择相应的设备后,会在选中的设备中弹出同样的Page Ability,并且TextField组件的数据与原设备上的完全相同,如图6所示。注意,只要被调用方安装了App,不管设备是否已经启动了App,否会自动弹出这个被迁移的Page Ability。

format,png

    图6  跨设备迁移Page Ability的效果

- EOF -

推荐阅读  点击标题可跳转

全球首款华为手机已经升级到鸿蒙了,先睹为快!

图解鸿蒙Page Ability的启动类型(LaunchType)

鸿蒙IDE(DevEco Studio)怎样1秒下载Gradle

特大喜讯!鸿蒙项目来了:在线电子词典

【喜讯、喜讯】期待已久的鸿蒙IDE macOS版终于发布了!

关注「极客起源」公众号,加星标,不错过精彩技术干货

format,png


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK