原子化服务的官方解析来啦~

一直关注我们的小伙伴们肯定听说过“原子化服务”了,可能有些小伙伴还听说过“元服务”。元服务,其实就是原子化服务。那么原子化服务到底是什么,权威的官方解析来啦~
一、原子化服务是什么?
我们日常生活中已经习惯了应用的概念,而原子化服务是harmonyos面向未来提供的一种用户程序形态。为什么需要一种新的用户程序形态呢?
传统的应用是以设备为中心,使用前必须手动安装应用,这样导致应用像生了根一样,牢牢的固定在某个设备上。而在万物互联的时代,人均持有设备量不断攀升,设备和场景的多样性,每个设备都需要独立开发一个应用,先安装后使用、不同设备的能力不兼容等传统应用的短板逐步暴露出来。在此背景下,应用提供方和用户都迫切需要一种新的服务提供方式,使应用开发更简单、服务(如听音乐、打车等)的获取和使用更便捷,原子化服务也就此诞生。
那么原子化服务到底是什么呢?
原子化服务是harmonyos提供的一种面向未来的服务方式,是有独立入口的(用户可通过点击方式直接触发)、免安装的(无需显式安装,由系统后台安装后即可使用)、可为用户提供一个或多个便捷服务的用户应用程序形态。
例如:传统方式的购物应用,在按照原子化服务理念调整设计后,可以由多个服务直达、免安装的原子化服务实现,比如“商品浏览”、“购物车”、“支付”等。
带您体验原子化服务
下面让我带您体验一下原子化服务,帮助大家更好地了解原子化服务到底是什么样的。
2.1多种入口
我们可以通过多种方式发现原子化服务:
一种为nfc标签,另一种为多功能码。nfc标签为物理打印标签,支持手机碰一碰使用相应服务。多功能码可以为物理打印的标签,支持手机碰一碰及扫一扫使用相应服务,也可以为屏幕上呈现的电子标签,支持扫一扫。多功能码有两种样式,分别用于跨设备体验和三方服务。
2.用户也可以在设备的服务中心、桌面等地方发现并管理原子化服务。
3.原子化服务可以基于合适场景被主动推荐给用户使用;用户也可以在服务中心和小艺建议中发现系统推荐的服务。
说明:“小艺”是语音助手在华为设备中的名字。小艺可以回答用户的问题、控制家居设备、执行用户的日常任务等;而且,小艺可以通过不同设备感知用户的使用场景,推荐用户可能需要的服务。
2.2服务卡片
与传统应用不同,原子化服务在设备桌面没有应用图标,是通过服务卡片的形式将重要信息展示在服务中心或者桌面。用户点击服务卡片,即可进入原子化服务的服务界面。
服务卡片的核心理念在于提供用户容易使用且一目了然的信息内容,将智慧化能力融入到服务卡片的体验中供用户选择使用,同时满足在不同终端设备上的展示和自适应。
值得注意的是,原子化服务和harmonyos应用都支持服务卡片。对于原子化服务,服务卡片是必选的,每个原子化服务至少有一个服务卡片。而对于harmonyos应用,服务卡片是可选配置。
说明:harmonyos应用,即运行在harmonyos系统上且具备harmonyos特性的应用。
2.3服务流转
原子化服务支持运行在1+8+n设备上。
“1”代表手机
“8”代表平板、智慧屏、音箱、眼镜、手表、车机、耳机、pc
“n”代表运动健康、智能家居、智慧出行、智慧办公、影音娱乐等场景延伸的泛iot设备。
原子化服务的流转能力打破设备界限,多设备联动,使原子化服务可分可合、可流转,实现如邮件跨设备编辑、多设备协同健身、多屏游戏等分布式业务。
原子化服务的流转触发方式有两种:系统推荐流转和用户手动流转。
①系统推荐流转:用户使用原子化服务时,如果所处环境中存在使用体验更优的可选设备,则系统自动为用户推荐该设备,用户可确认是否启动流转。
②用户手动流转:用户可以手动选择合适的设备进行流转。用户点击图标后,会调起系统提供的流转面板。面板中会展示出原子化服务的信息及可流转的设备,引导用户进行后续的流转操作。
2.4服务分享
原子化服务所提供的便捷服务,可以通过接入华为分享实现近距离快速分享,使便捷服务可以精准快速的推送至接收方,降低用户触达服务的成本,提升用户体验。相比于传统的社交软件分享,分享双方无需建立好友关系,接收方无需提前安装承载服务的安装包,即可享受原生的服务体验。
用户可在原子化服务内选择分享,打开“华为分享”开关后,将原子化服务分享给附近同样打开了“华为分享”开关的好友,好友点击确认后直接启动服务。下图是通过“华为分享”分享购物类原子化服务的典型场景。
原子化服务的优势在哪里?
3.1一次开发,多端部署
对于开发者而言,原子化服务只需开发一次,便可以部署在各种harmonyos终端上,大大降低了开发成本。
对于传统的app软件开发者来说,一个绕不开的烦恼就是同一个app需要分别针对不同的设备进行适配。比如程序员在手机上开发了一款应用,针对手表需要重新适配、发布到手表的应用市场;针对大屏适配后,再发布到大屏的应用市场,严重影响了应用的开发效率和变现能力。
harmonyos在架构设计之初,就提出了一次构建支持多端部署的架构设计原则。harmonyos通过提供用户程序框架、ability框架以及ui框架,能够保证开发的应用在多终端运行时保证一致性。多终端软件平台api具备一致性,确保用户程序的运行兼容性。如此一来,开发者仅需为不同形态的设备配置不同参数,ide就能够自动生成支持多设备分发的app包。app包上架应用市场后,应用市场会自动按照设备类型进行hap包的拆分、组装和分发,进而端到端实现了一次开发,支持多端部署的设计。
具体流程如下:
1. 开发阶段,ide基于包格式编译打包支持多设备的应用包。
2. 上架到应用市场。
3. 在云侧对app进行拆包,部署到cdn(content delivery network,内容分发网络),包信息同步到服务分发中心。
4. 端侧运行过程中,根据自身设备类型获取相应的hap及整体摘要信息。
3.2免安装,秒级打开
消费者不感知安装过程和卸载过程,体验全新升级。
harmonyos 原子化服务是轻量化服务的新物种,它提供了全新的服务和交互方式。用户在使用原子化服务时,如果服务未部署,系统将通过云端自动部署服务,部署成功后即可使用对应服务。例如,在服务中心点击服务卡片,原子化服务通过免安装能力完成部署和运行,实现服务直达的业务体验。无须用户跳转到传统的应用分发市场,搜索下载目标应用,使得在设备上部署应用更加快速。
随着分布式场景生态的丰富,原子化服务要始终以人为中心,在不同设备间流转。当用户走到大屏设备前,手机上的视频电话可以流转到大屏沟通,当用户走到电脑前,手机和电脑可以协同办公,原子化服务能够在不干扰用户的情况下完成了自动部署,同时,系统会智能地清理已部署的低频服务。
这就是原子化服务的免安装能力,一方面提升开发者上架应用的分发效率和转化率,一方面提升消费者的服务体验,减少安装过程对用户的干扰。
3.3以人为中心,分布式流转
分布式流转是实现原子化服务以人为中心的核心技术。
随着5g和iot设备的发展,个人拥有了多个智能设备也逐步成为主流场景。手机、笔记本、pad、电视、运动手表、耳机、冰箱、抽油烟机、智能门锁等这类智能设备在搭载harmonyos系统后,通过分布式软总线连接起来,就可以形成一个超级的终端。不同的设备之间,通过重新业务组合,可以形成新的用户体验。
例如:用户坐在书桌前用手机观看视频,又希望转移到客厅,坐在沙发上用大屏继续视频的观看。业界大多采用投屏的方案实现,如dlna、cast+等。而原子化服务采用的分布式组件流转的技术,简单来讲,就是harmonyos系统管理着原子化服务进程实体的上下文环境(打开的文件句柄,硬件,运行状态),并对上下文数据进行跨设备的备份、传输和恢复。如下图示意:
对于用户来说,流转操作应当是便捷的,高效的,无副作用的。用户可以进行反复流转,应用实体能够始终维持其状态。为了保证用户交互的一致性,流转的入口由系统统一提供。对于应用程序的一致性,由开发者维护。例如:当应用从手机迁移到大屏之后,其控件、样式、布局等方面应当尽可能保持一致。但“一致”不意味着“一样”:针对手机,平板电脑或者大屏各自屏幕的特征,其用户界面应当做好相应的适配。
3.4对比app clips和小程序,有什么优势?
app clips和小程序本质上都是针对服务线上化、交易闭环的场景在定义产品,天然追求随处可及和服务直达的特性。原子化服务与之相比,有以下优势:
1. 原子化服务是面向未来超级终端的服务形态,覆盖更广泛的iot设备,具备1+8+n设备兼容的api接口,这也是原子化服务相比app clips和小程序更具竞争力的根基。
2. 原子化服务是基于分布式全场景体验目标而设计的,也是与app clips和小程序在设计理念上的最大不同。harmonyos提供了超强的分布式能力,能够让开发者快速实现一个分布式业务。
3. 原子化服务有服务中心、碰一碰、扫一扫、卡片分享、流转业务触发等相比app clips和小程序更为丰富的入口, 支持服务快速直达。
如何开发原子化服务?
相信很多的开发者小伙伴们更为关注的是如何开发原子化服务,下面我们就来介绍。
4.1总体开发要求
1. 原子化服务的所有hap包均需要满足免安装要求。
2. 免安装的hap包不能超过10mb。
3. 原子化服务升级时,新版本也要保持免安装属性。
4. 目前支持免安装的hap的设备类型有:手机、平板、智慧屏、智能穿戴,版本均需要在harmonyos 2版本及以上。
5. 原子化服务如果要在服务中心露出,则需要满足:
该服务对应的hap包需要包含fa,且指定唯一的一个“mainability”作为用户操作入口。
需要配置一个小尺寸服务卡片(2*2规格),以及配置基础信息:如图标、名称、描述、快照等。
原子化服务的详细设计说明,可以参考官网:
https://developer.harmonyos.com/cn/docs/design/des-guides/service-overview-0000001139795693
4.2开发工具
huawei deveco studio(以下简称deveco studio)是基于intellij idea community开源版本打造,面向华为终端全场景多设备的一站式集成开发环境(ide),为开发者提供工程模板创建、开发、编译、调试、发布等e2e的harmonyos应用开发服务。
deveco studio下载链接:
https://developer.harmonyos.com/cn/develop/deveco-studio#download
我们使用deveco studio工具来开发原子化服务。该工具的详细使用说明,可以参考官网:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/tools_overview-0000001053582387
4.3开发过程及注意点
1. 创建工程
(1) 运行deveco studio工具,在菜单栏选择file > new > new project。
(2) 根据工程创建向导,选择需要的ability工程模板,然后点击next。
(3) 配置工程的基本信息。
project name:工程的名称,可以自定义。
project type:工程的类型,service表示原子化服务,application表示传统方式的需要安装的应用。因为要创建原子化服务工程,这里选择service。
device type:根据需要选择该工程支持的设备类型。支持多选。
注:如果勾选了tv,则下面的“show in service center”会消失。
show in service center:是否在服务中心露出。开启此开关,则默认创建一张小尺寸(2x2)服务卡片和快照。
(4) 点击finish,工具会自动生成示例代码和相关资源,等待工程创建完成。
2. 工程配置
(1) config.json配置文件
每个hap的根目录下都存在一个config.json配置文件,文件内容主要涵盖以下三个方面:
应用的全局配置信息,包含应用的包名、生产厂商、版本号等基本信息。
应用在具体设备上的配置信息,包含应用的备份恢复、网络安全等能力。
hap包的配置信息,包含每个ability必须定义的基本属性(如包名、类名、类型以及ability提供的能力),以及应用访问系统或其他应用受保护部分所需的权限等。
工程创建完成之后,config.json文件默认包含以下配置内容。
① 免安装配置信息
distro: { deliverywithinstall: true, modulename: entry, moduletype: entry, installationfree: true }
installationfree为true表示该hap是免安装的。
② 服务卡片配置信息
由于创建工程时开启了show in service center开关,所以默认配置了此信息。
abilities: [
{
skills: [
...
],
name: com.example.atomicservicedemo.mainability,
icon: $media:icon,
description: $string:mainability_description,
formsenabled: true,
label: $string:app_name,
type: page,
forms: [
{
jscomponentname: widget,
isdefault: true,
scheduledupdatetime: 10:30,
defaultdimension: 2*2,
name: widget,
description: $string:widget_description,
colormode: auto,
type: js,
supportdimensions: [
2*2
],
updateenabled: true,
updateduration: 1
}
],
launchtype: standard
}
]
config.json文件的详细说明,可以参考官网:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/basic-config-file-elements-0000000000034463
快照
创建工程时,如果开启了show in service center开关,工程创建完成后会在工程目录下自动生成快照(entrycard)文件夹。如下图所示:
此文件夹下默认生成了一张2x2(小尺寸)的快照(一张png格式的图片)。开发者可以将其替换为事先设计好的2x2快照,样式上应与对应的服务卡片保持一致:将新的快照拷贝到上图目录下,删除默认图片,新图片命名遵循格式“服务卡片名-2x2.png”。
说明:“服务卡片名”可以查看config.json文件的forms数组中的“name”字段。
3. 开发原子化服务
之前的推文中,我们已经介绍过服务卡片的开发,此处不再赘述,点击下方文字即可。
一文看懂harmonyos服务卡片运行原理和开发方法
我们重点介绍一下如何将原子化服务接入到华为分享。
以java工程为例,开发步骤如下:
① 新建两个idl文件,用于和华为分享进行跨进程通信。
ihwsharecallback.idl文件:
interface com.huawei.hwshare.third.ihwsharecallback {
[oneway] void notifystate([in] int state);
}
ihwshareservice.idl文件:
sequenceable ohos.interwork.utils.pacmapex;
interface com.huawei.hwshare.third.ihwsharecallback;
interface com.huawei.hwshare.third.ihwshareservice {
int startauth([in] string appid, [in] ihwsharecallback callback);
int sharefainfo([in] pacmapex pacmapex);
}
开发者只需将.idl文件保存至deveco studio项目的src/目录内,工具则会在构建应用时,在项目的generated/目录中生成iremoteobject接口文件、stub文件、proxy文件。ihwsharecallback.idl文件和ihwshareservice.idl文件会生成对应的ihwsharecallback.java和ihwshareservice.java。
② 新建一个管理类“shareatomicservicemanager.java”,用于管理与华为分享的跨进程通信。
这里对外暴露一个接口:
public void sharefainfo(string appid, pacmapex pacmap) {
if (mcontext == null) {
return;
}
mappid = appid;
msharepacmap = pacmap;
mhandler.removetask(mtask);
sharefainfo();
bindshareservice();
}
appid是应用在应用市场的唯一标识,在创建项目时生成。
pacmap是需要传递给华为分享的信息。
sharefainfo()用于分享fa信息到华为分享应用中,代码如下:
private void sharefainfo() {
if (mshareservice == null) {
return;
}
if (mhaspermission) {
hilog.info(label_log, log_format, tag, start sharefainfo.);
try {
mshareservice.sharefainfo(msharepacmap);
msharepacmap = null;
} catch (remoteexception e) {
hilog.error(label_log, log_format, tag, sharefainfo error.);
}
}
// 不使用时断开
mhandler.posttask(mtask, unbind_time);
}
其中,mtask用于执行断连的操作:
private final runnable mtask = () -> {
if (mcontext != null && mshareservice != null) {
mcontext.disconnectability(mconnection);
mhaspermission = false;
mshareservice = null;
}
};
另外,绑定华为分享服务的代码如下:
private void bindshareservice() {
if (mshareservice != null) {
// 保证仅连一次。
return;
}
hilog.info(label_log, log_format, tag, start bindshareservice.);
operation operation = new intent.operationbuilder().withbundlename(share_pkg_name)
.withaction(share_action).withflags(intent.flag_not_ohos_component).build();
intent intent = new intent();
intent.setoperation(operation);
mcontext.connectability(intent, mconnection);
其中,mconnection的定义如下:
// 管理与华为分享的连接 private final iabilityconnection mconnection = new iabilityconnection() {@override public void onabilityconnectdone(elementname elementname,iremoteobjectiremoteobject,int i) {hilog.error(label_log, log_format,tag,onabilityconnectdonesuccess.); mhandler.posttask(()->{mshareservice = new hwshareserviceproxy(iremoteobject); try {mshareservice.startauth(mappid, mfacallback); } catch (remoteexception e) {hilog.error(label_log,log_format,tag,startauth error.); }});} @override public void on abilitydisconnectdone(elementname elementname, int i) {hilog.info(label_log,log_format,tag,onabilitydisconnectdone.); mhandler.posttask(()->{mshareservice=null;mhaspermission=false;});}};
mshareservice.startauth(mappid, mfacallback)是对appid进行验证,验证成功之后会通过mfacallback回调。
mfacallback的代码如下:
private final hwsharecallbackstub mfacallback = new hwsharecallbackstub(hwsharecallbackstub) {
@override
public void notifystate(int state) throws remoteexception {
mhandler.posttask(()->{
hilog.info(label_log, log_format, tag, notifystate: + state);
if (state == 0) {
mhaspermission = true;
if (msharepacmap != null) {
sharefainfo();
}
}
});
}
};
state为0时表示认证通过,可以进行分享。
③ 在mainabilityslice.java中,调用连接华为分享的接口:
shareatomicservicemanager.getinstance(this).sharefainfo(629005930163350400, getpacmap());
629005930163350400是appid,每个应用不一样,需要替换成应用自己的appid。getpacmap是获取需要分享的内容封装方法。
private pacmapex getpacmap() {
pacmapex pacmap = new pacmapex();
pacmap.putobjectvalue(shareatomicservicemanager.sharing_fa_type, 0);
pacmap.putobjectvalue(shareatomicservicemanager.hm_bundle_name, getbundlename());
pacmap.putobjectvalue(shareatomicservicemanager.sharing_extra_info, 原子化服务分享额外内容);
pacmap.putobjectvalue(shareatomicservicemanager.hm_ability_name, mainability.class.getname());
pacmap.putobjectvalue(shareatomicservicemanager.sharing_content_info, 原子化服务通过华为分享的内容);
byte[] sharedcontentimg = getresourcebytes(resourcetable.media_share_conteng_img);
pacmap.putobjectvalue(shareatomicservicemanager.sharing_thumb_data, sharedcontentimg);
byte[] iconimg = getresourcebytes(resourcetable.media_icon);
pacmap.putobjectvalue(shareatomicservicemanager.hm_fa_icon, iconimg);
pacmap.putobjectvalue(shareatomicservicemanager.hm_fa_name, getstring(resourcetable.string_app_name));
return pacmap;
}
其中,常量的定义如下:
public static final string hm_fa_icon = ohos_fa_icon;
public static final string hm_fa_name = ohos_fa_name;
public static final string hm_ability_name = ohos_ability_name;
public static final string hm_bundle_name = ohos_bundle_name;
public static final string sharing_fa_type = sharing_fa_type;
public static final string sharing_thumb_data = sharing_fa_thumb_data;
public static final string sharing_content_info = sharing_fa_content_info;
public static final string sharing_extra_info = sharing_fa_extra_info;
常量含义说明如下:
对于图片资源的解析可以参考如下:
private byte[] getresourcebytes(int resid) {
inputstream resource = null;
bytearrayoutputstream outstream = null;
try {
resource = getresourcemanager().getresource(resid);
outstream = new bytearrayoutputstream();
byte[] buffer = new byte[1024];
int len;
while ((len = resource.read(buffer)) != -1) {
outstream.write(buffer, 0, len);
}
outstream.close();
resource.close();
return outstream.tobytearray();
} catch (ioexception e) {
hilog.error(tag, get resource occurs io exception!);
} catch (notexistexception e) {
hilog.error(tag, it dose not exist!);
} finally {
if (resource != null) {
try {
resource.close();
} catch (ioexception e) {
hilog.error(tag, close input stream occurs io exception!);
}
}
if (outstream != null) {
try {
resource.close();
} catch (ioexception e) {
hilog.error(tag, close output stream occurs io exception!);
}
}
}
return null;
}
大家也可以参考官网上接入华为分享的开发指导:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/huawei-share-service-sharing-guidelines-0000001141302387
运行工程
在虚拟机或者真机运行创建的工程之后,会显示原子化服务的主界面(即服务界面)。但是在桌面找不到原子化服务图标,因为原子化服务在桌面是没有icon的。可以在服务中心通过搜索原子化服务的名称找到该原子化服务,将其服务卡片添加到桌面。
原子化服务接入华为分享的运行结果,需要准备两台harmonyos手机,且其系统软件版本不低于harmonyos 2。
以上就是本期原子化服务的介绍了,你get到了吗?期待更多的开发者小伙伴们加入我们,开启您的原子化服务开发之旅哦~
fqj

法国监管机构正式发布了3.4-3.8 GHz频段的5G拍卖规则
新唐开发平台黄金3部曲:第1部,开发
微软采购华为AI芯片应用于中国的数据中心
开关电源欠压,过温,CNT保护综合电路设计分析
AI芯片应用在5G时代有了怎样的新机遇
原子化服务的官方解析来啦~
光纤光缆的链接方式有哪些?
嵌入式Linux的开机启动流程简单的介绍
超越苹果MacBook Pro?爆料大神公开Surface Pro5最新规格信息
蓄电池常用的五种充电方式
8英寸晶圆产能紧张的连锁反应
安科瑞AKH-0.66/K开口式电流互感器 用于配电系统改造项目
日本与荷兰签署半导体合作备忘录:采购 ASML ***,加强技术合作
如何构建不伤害人类的工业机器人
什么是钢塑复合管
中国移动5G+不断落地实现了多点开花赋能行业融合
中国联通完成5G社会化基站与自研网管系统对接
回顾应链全生命周期管理平台研讨会的内容和说明
华为5G随行WiFi系列开售,支持AI高铁模式售价1699元起
新款iPadPro或将首度采用高单价LCP软板 将降低信号耗损并改善联网性能