当前位置:   article > 正文

【HarmonyOS】元服务和APP的相互跳转、相互成就_元服务能跳转微信小程序吗?

元服务能跳转微信小程序吗?

【关键字】

卡片、跳转、加桌

【背景介绍】

随着鸿蒙生态的发展,各种类型的应用都已经可以在Harmony OS上无差异的运行,面对鸿蒙新兴元服务的兴起,各大厂家可能都在考虑一个问题:如果已经有APP了,有必要再开发一款元服务吗?是化蛇添足还是画龙点睛?元服务跟已有应用是什么关系?维护工作会不会多?

回答问题之前我们先看一张图:

unnaming.png

这些原生APP仿佛有一大堆话憋在肚子里,试图通过右上方的提示气泡呼唤用户,仿佛再说:点我,点我。反观元服务这个标题党简直晃眼,并且元服务也是基于系统级API开发的,性能、设计、效果和流畅程度都可以比肩原生APP,然而 元服务也不是十项全能,从官方定义就能看出:原子化服务是HarmonyOS提供的一种面向未来的服务提供方式,是有独立入口的(用户可通过点击方式直接触发)、免安装的(无需显式安装,由系统程序框架后台安装后即可使用)、可为用户提供一个或多个便捷服务的用户应用程序形态。受限于HAP包大小限制,注定只能承载单一的业务。APP相比元服务能提供更完整、更丰富的应用体验;

看完区别我们再回到上面问题(以打车类型应用为例):

(一)通过APP引导用户添加元服务到桌面,即可以让用户使用更加方便;也可以让厂商推广更加容易;并且只需要开发一些元服务的页面;运维都使用现有服务的接口;

unnaming%20(1).png

技术实现:参照AGDS Preview Link,当前免费对外开放;

(二)充分利用元服务的各种接入方式和免安装的特点抢先服务用户,抢占用户;想想这年头如果敲敲桌子就能点菜,还有人会去打开摄像头瞄准对焦吗?更别提下载个APP了;

unnaming%20(2).png

有了元服务再逐步引导用户下载APP享用更丰富的APP能力,跟用户深度绑定;

技术实现:创建demo工程,选择JS语言开发,在index/index.hml中编写页面布局

代码如下:

  1. <div class="container">
  2. <div class="copyText" onclick="goApp">
  3. <text>
  4. <span>more</span>
  5. </text>
  6. </div></div>

index/index.css编写样式

  1. .container{
  2. box-sizing: border-box;
  3. display: flex;
  4. flex-direction: column;
  5. align-items: center;
  6. height: 100%;
  7. width: 100%;
  8. background-color: aliceblue;
  9. }
  10. .go-div{
  11. width:400px;
  12. padding: 20px;
  13. justify-content:center;
  14. background-color:#EA545D;
  15. color:white;
  16. height: 100px;
  17. margin-bottom: 40px;
  18. margin-top: 20px;
  19. border-radius:20px;
  20. }

跳转实现代码在index/index.js中实现

  1. export default{
  2. data:{
  3. },
  4. async goApp(){
  5. var actionData = {};
  6. var action = {};
  7. action.bundleName = "com.h.j.hmservice";
  8. action.abilityName = "com.huawei.jsproject.ServiceAbility";
  9. action.messageCode = 1;
  10. action.data = actionData;
  11. action.abilityType = 0;
  12. action.syncOption = 1;
  13. await FeatureAbility.callAbility(action);
  14. }
  15. }

新建ServiceAbility用来处理JS请求并实现跳转逻辑

  1. public class ServiceAbility extends Ability {
  2. private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD001100, "Demo");
  3. private MyRemote remote = new MyRemote();
  4. private Context context;
  5. @Override
  6. public IRemoteObject onConnect(Intent intent) {
  7. HiLog.info(LABEL_LOG, "IRemoteObject::onConnect");
  8. this.context = this;
  9. super.onConnect(intent);
  10. return remote.asObject();
  11. }
  12. class MyRemote extends RemoteObject implements IRemoteBroker {
  13. MyRemote() {
  14. super("MyService_MyRemote");
  15. }
  16. @Override
  17. public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) {
  18. System.out.println("test js Go");
  19. switch (code) {
  20. case 1: {
  21. //如果APP已存在拉起APP
  22. if (isAppExist(context, "com.petal.litegames")) {
  23. Intent intent = new Intent();
  24. Set<String> entities = new HashSet<>();
  25. entities.add("android.intent.category.LAUNCHER");
  26. Operation operation = new Intent.OperationBuilder()
  27. .withDeviceId("")
  28. .withBundleName("com.petal.litegames")
  29. .withAction("android.intent.action.MAIN")
  30. .withFlags(Intent.FLAG_NOT_OHOS_COMPONENT)
  31. .withEntities(entities)
  32. .build();
  33. intent.setOperation(operation);
  34. startAbility(intent);
  35. //如果APP不存在跳转到下载页面
  36. } else {
  37. Intent intent = new Intent();
  38. Operation operation = new Intent.OperationBuilder()
  39. .withAction("android.intent.action.VIEW")
  40. .withUri(Uri.parse("https://url.cloud.huawei.com/iwTjB76GHe?shareTo=qrcode"))
  41. .withFlags(Intent.FLAG_ABILITY_NEW_MISSION)
  42. .build();
  43. intent.setOperation(operation);
  44. startAbility(intent);
  45. }
  46. break;
  47. }
  48. default: {
  49. Map<String, Object> result = new HashMap<String, Object>();
  50. reply.writeString(ZSONObject.toZSONString(result));
  51. return false;
  52. }
  53. }
  54. return true;
  55. }
  56. @Override
  57. public IRemoteObject asObject() {
  58. return this;
  59. }
  60. }
  61. boolean isAppExist(Context context, String appPkg) {
  62. try {
  63. IBundleManager manager = context.getBundleManager();
  64. return manager.isApplicationEnabled(appPkg);
  65. } catch (IllegalArgumentException e) {
  66. return false;
  67. }
  68. }}

把什么功能放在元服务中需要开发者根据用户使用场景各自划分了,最后期待元服务百花齐放。

欲了解更多更全技术文章,欢迎访问https://developer.huawei.com/consumer/cn/forum/?ha_source=zzh

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/339821
推荐阅读
相关标签
  

闽ICP备14008679号