❝儿童节的第二天是什么日子?呃!-- 是鸿蒙的生日呀!是的,在 2021年06月02日正式发布了HarmonyOS。让我印象比较深刻的是HarmonyOS的分布式能力,苦于没有真机吧,我也一直没有深入地去了解分布式能力背后的技术实现。直到DevEco Studio 上线了分布式模拟器(Super device)……
❞
广而告之
在2021年06月02日,HarmonyOS 发布的当天,DevEco Studio也发布了支持远程分布式模拟器功能的新版本,尽管目前还是实验特性,我觉得对于没有设备的开发者来说,简直比618钜惠更钜惠!
-
官方网站: https://www.harmonyos.com/ -
操作文档:使用分布式模拟器运行应用 -
「注意事项:使用分布式模拟器前,请不要连接安卓设备!!!」
DevEco Studio升级
如果您使用的旧版DevEco Studio,请升级到最新版本。当然,如果您还没有安装DevEco Studio,那么恭喜您,您一定不会遇到我踩过的坑!
我在升级DevEco Studio之后,遇到了远程模拟器无法开启的问题,后来经过重新安装SDK解决了!
问题的截图如下:
重新安装 SDK得以解决:
当前我的DevEco Studio版本:
体验分布式模拟器
首先,我们需要开启分布式模拟器的功能。我们进到编辑器的实验特性设置,开启相应的能力,主要是勾选「Enable Super Device」:
再进到模拟器设备管理就能看到远程的分布式模拟器了:
目前支持 「手机+手机」 以及 「手机 + 平板」。
如果此时您想体验分布式能力,我们可以根据模板新建支持分布式的模板,比如「Video Player Ability」:
或者直接获取 Codelab 的代码:
git clone https://gitee.com/openharmony/codelabs/
其中以Distributed
开头的都是分布式能力的应用。比如分布式邮件应用、分布式地图应用、分布式视频应用、分布式游戏,涵盖了多种场景,也方便大家拓展创意。
我这里以分布式邮件应用为例。分布式邮件应用极大方便了我们对邮件的编辑,比如鸿蒙A设备上写邮件想要用到鸿蒙B设备的文件作为附件,我们可以将应用从A设备流转到B设备,从而使得邮件应用能够直接使用B设备的文件作为附件。
我们先启动分布式模拟器,本次我使用的是「手机+平板」:
接着,我们可以直接选择 super app 进行分布式应用的运行:
此时值得注意的有几点:
-
-
此时千万不要连接安卓设备!!!
-
-
-
分布式模拟器暂时不太稳定,如果遇到有设备黑屏,请关掉远程模拟器重新再开
-
如果我连接了安卓设备会怎样?
duang……duang……duang!会没法选择设备!!!
当我把安卓设备一拔掉就立马恢复正常:
(别问我为什么,我也一脸问号,期待评论区的解答)
啥也不说,先运行:
好家伙,我直接好家伙,成功了!
直接就是分布式能力的体验,看好了,我要流转了~:
duang……duang……duang……
就问你,牛B不牛B?
最后,我们看看核心的代码实现:
public class MainAbility extends Ability implements IAbilityContinuation {
...
@Override
public void onCompleteContinuation(int code) {}
@Override
public boolean onRestoreData(IntentParams params) {
return true;
}
@Override
public boolean onSaveData(IntentParams params) {
return true;
}
@Override
public boolean onStartContinuation() {
return true;
}
}
public class MailEditSlice extends AbilitySlice implements IAbilityContinuation {
...
@Override
public boolean onStartContinuation() {
LogUtil.info(TAG, "is start continue");
return true;
}
@Override
public boolean onSaveData(IntentParams params) {
...
LogUtil.info(TAG, "begin onSaveData:" + mailData);
...
LogUtil.info(TAG, "end onSaveData");
return true;
}
@Override
public boolean onRestoreData(IntentParams params) {
LogUtil.info(TAG, "begin onRestoreData");
...
LogUtil.info(TAG, "end onRestoreData, mail data: " + cachedMailData);
return true;
}
@Override
public void onCompleteContinuation(int i) {
LogUtil.info(TAG, "onCompleteContinuation");
terminateAbility();
}
}
结语
似乎发现了这个省钱秘诀,您 Get 到了吗?拥抱鸿蒙,拥抱未来!One as all, all as one!