问题:有没有实现基于当前Android业务的简单的Harmony多设备协同方案?目前现有业务已安全运行多年,但又想搭上鸿蒙系统跨平台的快车,怎么能在最少开销下,给当前业务加上鸿蒙跨平台快车呢?
回答: 由于鸿蒙生态尚不健全,很多功能没法深入研究,只能通过现有的Android开发经验,去构想鸿蒙开发可行性。 背景知识: 1、Android可以通过路由方式唤起应用 2、鸿蒙跨设备数据系统 简单的方案如下图所示:
第一步:现有的Android客户端通过Intent唤起鸿蒙桥应用 Intent intent = getPackageManager().getLaunchIntentForPackage("鸿蒙桥包名"); intent.putExtra("key", "value"); if(intent != null){ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } 第二步:鸿蒙桥获取可以连接的设备 DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE); 用户选择需要连接设备。 第三步:通过鸿蒙桥进行数据协同 Intent intent = new Intent(); intent.setParam("key", "value"); Operation operation = new Intent.OperationBuilder() .withDeviceId(targetDevice.getDeviceId()) .withBundleName(getBundleName()) .withAbilityName(CommonConstantData.ABILITY_MAIN) .withAction("action") .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE) .build(); intent.setOperation(operation); try { //检查远端对象是否有对应的Ability List<AbilityInfo> abilityInfos = getBundleManager().queryAbilityByIntent(intent, 0, 0); if(abilityInfos != null && !abilityInfos.isEmpty()){ startAbility(intent); } } catch (Exception e) { e.printStackTrace(); } 第四步:鸿蒙桥传递数据到Android客户端 Intent intent = new Intent(); intent.setParam("key", "value"); Operation operation = new Intent.OperationBuilder() .withUri(Uri.parse("Dest Page Router Path")) .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE) .build(); intent.setOperation(operation); startAbility(intent); 至此,就可以实现现有Android应用的把数据同步到另一台设备。
说明: 整个流程是可行的。但需要,这个方案不是基于鸿蒙的Ability能力迁移,二是对Android数据进行鸿蒙跨平台能力加持,相当于加了buff,Android应用本质没有改变。同时需要注意以下问题: 1、改方案需要用户安装额外的桥应用,用户存在抵触风险。 如果用户不选择安装鸿蒙桥,就白搭了。 私下觉得这个桥实现起来非常简单,如果鸿蒙系统将来能够提供标准接口,将极大降低Android客户端移植复杂度,提升用户体验。 2、本地数据通过Intent传递数据有限制 Android系统对Intent传递数据量有限制。所以如果是本地数据(多媒体等大文件)进行跨设备迁移,存在风险。目前不确定鸿蒙系统对于跨设备传递的文件大小是否有限制。 对于这种情况,不缺钱的情况下,可以先把数据传到云端。通过鸿蒙桥只进行简单数据传递。 3、Android应用和鸿蒙桥分开审核 如果有修改,两个客户端都需要发布。任何一个端审核不通过,另一个端发布更新。会存在新老版本不兼容的问题。所以在开发时,鸿蒙桥一定要健壮,尽量做到原子化。 上面是对现有Android应用实现在鸿蒙系统跨设备方案的一种简单探索,肯定会有更好的。 |