【HarmonyOS】元服务和APP的相互跳转、相互成就

news2024/11/15 12:22:38

【关键字】

卡片、跳转、加桌

【背景介绍】

随着鸿蒙生态的发展,各种类型的应用都已经可以在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中编写页面布局

代码如下:

<div class="container">
    <div class="copyText" onclick="goApp">
        <text>
            <span>more</span>
        </text>
    </div></div>

index/index.css编写样式

.container{
    box-sizing: border-box;
    display: flex;
    flex-direction: column;
    align-items: center;
    height: 100%;
    width: 100%;
    background-color: aliceblue;
}
.go-div{
    width:400px;
    padding: 20px;
    justify-content:center;
    background-color:#EA545D;
    color:white;
    height: 100px;
    margin-bottom: 40px;
    margin-top: 20px;
    border-radius:20px;
}

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

export default{
    data:{

    },
    async goApp(){
        var actionData = {};
        var action = {};
        action.bundleName = "com.h.j.hmservice";
        action.abilityName = "com.huawei.jsproject.ServiceAbility";
        action.messageCode = 1;
        action.data = actionData;
        action.abilityType = 0;
        action.syncOption = 1;
        await FeatureAbility.callAbility(action);

    }
}

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

public class ServiceAbility extends Ability {
    private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD001100, "Demo");
    private MyRemote remote = new MyRemote();
    private Context context;

    @Override
    public IRemoteObject onConnect(Intent intent) {
        HiLog.info(LABEL_LOG, "IRemoteObject::onConnect");
        this.context = this;
        super.onConnect(intent);
        return remote.asObject();
    }
    class MyRemote extends RemoteObject implements IRemoteBroker {
        MyRemote() {
            super("MyService_MyRemote");
        }
        @Override
        public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) {
            System.out.println("test js Go");
            switch (code) {
                case 1: {
                    //如果APP已存在拉起APP
                    if (isAppExist(context, "com.petal.litegames")) {
                        Intent intent = new Intent();
                        Set<String> entities = new HashSet<>();
                        entities.add("android.intent.category.LAUNCHER");
                        Operation operation = new Intent.OperationBuilder()
                                .withDeviceId("")
                                .withBundleName("com.petal.litegames")
                                .withAction("android.intent.action.MAIN")
                                .withFlags(Intent.FLAG_NOT_OHOS_COMPONENT)
                                .withEntities(entities)
                                .build();
                        intent.setOperation(operation);
                        startAbility(intent);
                   //如果APP不存在跳转到下载页面
                    } else {
                        Intent intent = new Intent();
                        Operation operation = new Intent.OperationBuilder()
                                .withAction("android.intent.action.VIEW")
                                .withUri(Uri.parse("https://url.cloud.huawei.com/iwTjB76GHe?shareTo=qrcode"))
                                .withFlags(Intent.FLAG_ABILITY_NEW_MISSION)
                                .build();
                        intent.setOperation(operation);
                        startAbility(intent);
                    }
                    break;
                }
                default: {
                    Map<String, Object> result = new HashMap<String, Object>();
                    reply.writeString(ZSONObject.toZSONString(result));
                    return false;
                }
            }
            return true;
        }
        @Override
        public IRemoteObject asObject() {
            return this;
        }
    }
    boolean isAppExist(Context context, String appPkg) {
        try {
            IBundleManager manager = context.getBundleManager();
            return manager.isApplicationEnabled(appPkg);
        } catch (IllegalArgumentException e) {
            return false;
        }
    }}

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/593592.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用 JavaScript 对抗 DDOS 攻击 (下)

抗 v2 之前的那些奇技淫巧&#xff0c;纯属娱乐而已&#xff0c;并不能撑多久。 但简单、好玩&#xff0c;似乎这正是对抗的乐趣。之前从未想过&#xff0c;居然还能把脚本黑科技&#xff0c;用在网络防御上。 于是&#xff0c;又陆陆续续对抗了一段时间。 直到兴致淡却&am…

WordPress 网站管家小程序源码

正文&#xff1a; Wordpress网站管家小程序源码&#xff0c;基于uniapp开发的产品&#xff0c;WP管家是主打用户访问端&#xff0c;兼容了微信小程序与安卓APP&#xff08;其他端未测试&#xff09;&#xff0c;用于用户的访问。 1、在Wordpress根目录新建一个文件夹&#xf…

达美乐的面试(部分)(未完全解析)

Java如何保证非线程安全的数据结构&#xff08;比如HashMap&#xff09;的原子性&#xff1f;读多写少时用哪种锁好? A: 方法1&#xff1a;CAS等乐观锁机制&#xff0c;方法2&#xff1a;如果读多写少&#xff0c;可以使用读写锁&#xff08;ReentrantReadWriteLock&#xff0…

在Centos Stream 9上Docker的实操教程(二) - Docker的常用命令

在Centos Stream 9上Docker的实操教程 - Docker的常用命令 Docker启动类命令Docker镜像命令镜像列表 docker images镜像查找 docker search拉取镜像 docker pull删除镜像 docker rmi查看占用信息 docker system df容器创建新镜像 docker commit 容器命令启动容器 docker run查看…

vue组件化路由

文章目录 vue项目1.vue组件2.插槽3.自定义指令4.vue路由 vue项目 vue项目中src目录的构成 assets: 存放项目中用到的静态资源文件,例如css,图片资源等components: 存放我们封装的、可复用的组件main.js: 项目的入口文件,整个项目的运行要先执行main.jsApp.vue: 项目的根组件 …

定时器详解 -- 定时器中断、PWM输出 --stm32

STM32定时器使用 STM32定时器计数模式定时器工作原理基本定时器&#xff1a;TIM6、TIM7示例代码代码讲解 通用定时器&#xff1a;TIM2、TIM3、TIM4、TIM5高级定时器&#xff1a;TIM1、TIM8定时器PWM输出原理通用定时器3控制通道1输出PWM脉冲代码 总结参考资料 STM32定时器 STM…

加密与解密 调试篇 动态调试技术 (三)-OllyDbg 插件 Run/Hit 符号调试 加载程序

目录 插件 这里给出一个命令行插件 Run Trace 运行 Hit Trace 符号调试 符号格式 1.SYM格式 2.COFF格式 3.CodeView格式 4.PDB格式 5.DBG格式 6.MAP文件 创建调试文件 加载程序 1.CreateProcess 2.将OllyDbg附加到一个正在运行的程序上 插件 OllyDbg允许插件 …

1计算机网络体系结构_1.1计算机网络概述

1.1.1计网_概念 概念&#xff1a; 计网是一个 将【分散的、具有独立功能的】计算机系统&#xff0c;通过【通信设备与线路】连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统。简言之&#xff0c;计算机网络就是一些 互连的、自治的 计算机系统 的 集合。 …

excel函数采集,截取特殊符号前面/后面数据

截取前面 LEFT(I2,FIND("-",I2)-1) 截取后面 MID(I2,FIND("-",I2)1,99) 房贷利率计算公司&#xff0c;等额本金 (B2-G2*A2)*F2*0.01 Excel常用电子表格公式大全  一、Excel基本公式   1、查找重复内容公式&#xff1a;IF(COUNTIF(A:A,A2)>1,&qu…

国密算法解析

国密算法即国家密码局认定的国产密码算法。 国密算法是商用密码&#xff0c;仅能用于商业用途。国密算法是一套标准&#xff0c;由国家密码局制定的规范&#xff0c;凡是符合的&#xff0c;都可以称之为国密算法。国密算法暂无官方的代码实现&#xff0c;企业可以自己编码实现…

2022年五一杯数学建模A题血管机器人的订购与生物学习解题全过程及论文和程序

2022年五一杯数学建模A题 血管机器人的订购与生物学习 原题再现&#xff1a; 随着微机电系统的发展&#xff0c;人类已经可以加工越来越小的机器。这些机器小到一定程度就可以放进血管开展疾病治疗&#xff0c;这就是血管机器人。血管机器人可以携带药物放入血管里定点治疗与…

信号调制的工作原理

要理解如何进行无线数据传输&#xff0c;我们需要了解&#xff1a; 什么是频率&#xff1f; 信息/数据信号 时间表示 频率表示&#xff0c;为什么它很重要&#xff1f; 滤波器如何工作&#xff1f; FCC通信频段 调制和解调 这些主题可能您在大学专业课上学过&#xff0c…

uboot下的mw写内存和md显示内存命令以及nand命令

配置uboot参数 setenv ipaddr 192.168.0.10;setenv serverip 192.168.0.40;setenv gatewayip 192.168.0.1;setenv netmask 255.255.255.0 setenv bootargs mem512M consolettyAMA0,115200 root/dev/mtdblock2 rootfstypeyaffs2 rw init/init mtdpartshinand:1M(boot),4M(kern…

面试offer收割机,爆肝整理高频软件测试面试题(带答案)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 软件测试面试题&am…

excel 给合并的单元格进行序号填充

一、问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 在使用excel 的时候&#xff0c;是否遇到过要给合并单元格排序的情况&#xff0c;下拉会显示需要相同的单元格才行&#xff0c;如图&#xff1a; 二、解决方案 目的是给单元格计数&#xff0c;所以使用…

Module not found: Error: Can‘t resolve ‘fs‘ in ‘/root/workspace/

项目发版时 因为webpack5 不会自动引入polyfills 导致报了一系列错&#xff0c; 按照提示做如下配置 externals 官网文档解释的很清楚&#xff0c;就是webpack可以不处理应用的某些依赖库&#xff0c;使用externals配置后&#xff0c;依旧可以在代码中通过CMD、AMD或者wi…

打车/代驾/跑腿小程序源码司机入住uniapp/thinkphp

开发代驾顺风车货运 客户端&#xff1a;Uniapp 开发 司机端&#xff1a;Uniapp 开发 后台&#xff1a;thinkphp5 框架 数据库&#xff1a;MySQL 打车/代驾/跑腿小程序源码司机入住uniapp/thinkphp 为什么用UNIAPP开发&#xff1f; UNIAPP框架简单&#xff0c;学习成本低…

Spring(IOC,DI,事务)属性

Spring&#xff08;IOC&#xff0c;DI&#xff0c;事务&#xff09;属性 IOC 概念 Inverse Of Controll&#xff1a;控制反转&#xff1b;反转了依赖关系的满足方式&#xff0c;由之前的自己创建依赖对象&#xff0c;变为由工厂推送。(变主动为被动&#xff0c;即反转)解决了…

1_5 optical_flow

采用特征点法做VO存在耗时较大的问题&#xff0c;一般耗时情况&#xff1a;如下 (1) 在图像中提取特征点并计算特征描述&#xff0c; 非常耗时 ~10ms ORB&#xff0c;shift耗时更多&#xff1b; (2) 在不同图像中寻找特征匹配&#xff0c; 非常耗时 …

day43|动态规划5-不同0-1背包的问题形态

关键点&#xff1a; 找到前后两种状态的依赖关系 经典0-1背包&#xff1a; 给定一个背包&#xff0c;问装满该背包的最大价值。分割等和子集&#xff1a; 给定一个背包&#xff0c;能不能装满该背包&#xff08;将重量抽象成价值&#xff09;最后一块石头重量&#xff1a; 给一…