而在万物互联的时代,人均持有设备量不断攀升,设备和场景的多样性,每个设备都需要独立开发一个应用,先安装后使用、不同设备的能力不兼容等传统应用的短板逐步暴露出来。在此背景下,应用提供方和用户都迫切需要一种新的服务提供方式,使应用开发更简单、服务(如听音乐、打车等)的获取和使用更便捷。基于此,HarmonyOS提供了原子化服务。
我们提供的服务有:成都网站建设、网站制作、微信公众号开发、网站优化、网站认证、固安ssl等。为1000+企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的固安网站制作公司
相信很多开发者小伙伴听说过“原子化服务”,又或者是“元服务”。其实,元服务就是原子化服务。那么原子化服务到底是什么呢?接下来就带开发者详细了解下。
原子化服务是HarmonyOS提供的一种面向未来的服务方式,是有独立入口的(用户可通过点击方式直接触发)、免安装的(无需显式安装,由系统后台安装后即可使用)、可为用户提供一个或多个便捷服务的用户应用程序形态。
例如:传统方式的购物应用,在按照原子化服务理念调整设计后,可以由多个服务直达、免安装的原子化服务实现,比如“商品浏览”、“购物车”、“支付”等。
为了帮助开发者更好地了解原子化服务到底是什么,下面就和开发者小伙伴们一起体验一下原子化服务。
我们可以通过多种方式发现原子化服务:
说明:“小艺”是语音助手在华为设备中的名字。小艺可以回答用户的问题、控制家居设备、执行用户的日常任务等;而且,小艺可以通过不同设备感知用户的使用场景,推荐用户可能需要的服务
与传统应用不同,原子化服务在设备桌面没有应用图标,是通过服务卡片的形式将重要信息展示在服务中心或者桌面。用户点击服务卡片,即可进入原子化服务的服务界面。
服务卡片的核心理念在于提供用户容易使用且一目了然的信息内容,将智慧化能力融入到服务卡片的体验中供用户选择使用,同时满足在不同终端设备上的展示和自适应。
值得注意的是,原子化服务和HarmonyOS应用都支持服务卡片。对于原子化服务,服务卡片是必选的,每个原子化服务至少有一个服务卡片。而对于HarmonyOS应用,服务卡片是可选配置。
说明:HarmonyOS应用,即运行在HarmonyOS系统上且具备HarmonyOS特性的应用。
原子化服务支持运行在1+8+N设备上。
原子化服务的流转能力打破设备界限,多设备联动,使原子化服务可分可合、可流转,实现如邮件跨设备编辑、多设备协同健身、多屏游戏等分布式业务。原子化服务的流转触发方式有两种:系统推荐流转和用户手动流转。
①系统推荐流转:用户使用原子化服务时,如果所处环境中存在使用体验更优的可选设备,则系统自动为用户推荐该设备,用户可确认是否启动流转。
②用户手动流转:用户可以手动选择合适的设备进行流转。用户点击图标后,会调起系统提供的流转面板。面板中会展示出原子化服务的信息及可流转的设备,引导用户进行后续的流转操作。
原子化服务所提供的便捷服务,可以通过接入华为分享实现近距离快速分享,使便捷服务可以精准快速的推送至接收方,降低用户触达服务的成本,提升用户体验。相比于传统的社交软件分享,分享双方无需建立好友关系,接收方无需提前安装承载服务的安装包,即可享受原生的服务体验。
用户可在原子化服务内选择分享,打开“华为分享”开关后,将原子化服务分享给附近同样打开了“华为分享”开关的好友,好友点击确认后直接启动服务。下图是通过“华为分享”分享购物类原子化服务的典型场景。
对于开发者而言,原子化服务只需开发一次,便可以部署在各种HarmonyOS终端上,大大降低了开发成本。
对于传统的APP软件开发者来说,一个绕不开的烦恼就是同一个APP需要分别针对不同的设备进行适配。比如程序员在手机上开发了一款应用,针对手表需要重新适配、发布到手表的应用市场;针对大屏适配后,再发布到大屏的应用市场,严重影响了应用的开发效率和变现能力。
HarmonyOS在架构设计之初,就提出了一次构建支持多端部署的架构设计原则。HarmonyOS通过提供用户程序框架、Ability框架以及UI框架,能够保证开发的应用在多终端运行时保证一致性。多终端软件平台API具备一致性,确保用户程序的运行兼容性。
如此一来,开发者仅需为不同形态的设备配置不同参数,IDE就能够自动生成支持多设备分发的APP包。APP包上架应用市场后,应用市场会自动按照设备类型进行HAP包的拆分、组装和分发,进而端到端实现了一次开发,支持多端部署的设计。
具体流程如下:
消费者不感知安装过程和卸载过程,体验全新升级。
HarmonyOS 原子化服务是轻量化服务的新物种,它提供了全新的服务和交互方式。用户在使用原子化服务时,如果服务未部署,系统将通过云端自动部署服务,部署成功后即可使用对应服务。例如,在服务中心点击服务卡片,原子化服务通过免安装能力完成部署和运行,实现服务直达的业务体验。无须用户跳转到传统的应用分发市场,搜索下载目标应用,使得在设备上部署应用更加快速。
随着分布式场景生态的丰富,原子化服务要始终以人为中心,在不同设备间流转。当用户走到大屏设备前,手机上的视频电话可以流转到大屏沟通,当用户走到电脑前,手机和电脑可以协同办公,原子化服务能够在不干扰用户的情况下完成了自动部署,同时,系统会智能地清理已部署的低频服务。
这就是原子化服务的免安装能力,一方面提升开发者上架应用的分发效率和转化率,一方面提升消费者的服务体验,减少安装过程对用户的干扰。
分布式流转是实现原子化服务以人为中心的核心技术。
随着5G和IoT设备的发展,个人拥有了多个智能设备也逐步成为主流场景。手机、笔记本、平板、电视、运动手表、耳机、冰箱、抽油烟机、智能门锁等这类智能设备在搭载HarmonyOS系统后,通过分布式软总线连接起来,就可以形成一个超级的终端。不同的设备之间,通过重新业务组合,可以形成新的用户体验。
例如:用户坐在书桌前用手机观看视频,又希望转移到客厅,坐在沙发上用大屏继续视频的观看。业界大多采用投屏的方案实现,如DLNA、Cast+等。而原子化服务采用的分布式组件流转的技术,简单来讲,就是HarmonyOS系统管理着原子化服务进程实体的上下文环境(打开的文件句柄,硬件,运行状态),并对上下文数据进行跨设备的备份、传输和恢复。如下图示意:
对于用户来说,流转操作应当是便捷的,高效的,无副作用的。用户可以进行反复流转,应用实体能够始终维持其状态。为了保证用户交互的一致性,流转的入口由系统统一提供。对于应用程序的一致性,由开发者维护。例如:当应用从手机迁移到大屏之后,其控件、样式、布局等方面应当尽可能保持一致。但“一致”不意味着“一样”:针对手机,平板电脑或者大屏各自屏幕的特征,其用户界面应当做好相应的适配。
App Clips和小程序本质上都是针对服务线上化、交易闭环的场景在定义产品,天然追求随处可及和服务直达的特性。原子化服务与之相比,有以下优势:
原子化服务是面向未来超级终端的服务形态,覆盖更广泛的IoT设备,具备1+8+N设备兼容的API接口,这也是原子化服务相比APP Clips和小程序更具竞争力的根基。
原子化服务是基于分布式全场景体验目标而设计的,也是与App Clips和小程序在设计理念上的最大不同。HarmonyOS提供了超强的分布式能力,能够让开发者快速实现一个分布式业务。
原子化服务有服务中心、碰一碰、扫一扫、卡片分享、流转业务触发等相比App Clips和小程序更为丰富的入口, 支持服务快速直达。
便捷的原子化服务如何开发?这应该是开发者小伙伴更关注的问题,下面就来详细介绍。
原子化服务的详细设计说明,可以参考官网:
https://developer.harmonyos.com/cn/docs/design/des-guides/service-overview-0000001139795693
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
创建工程
点击Finish,工具会自动生成示例代码和相关资源,等待工程创建完成。
工程配置
每个HAP的根目录下都存在一个config.json配置文件,文件内容主要涵盖以下三个方面:
工程创建完成之后,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”字段。
开发原子化服务
我们重点介绍一下如何将原子化服务接入到华为分享。
以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();
- }
- 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, IRemoteObject iRemoteObject, int i) { HiLog.error(LABEL_LOG, LOG_FORMAT, TAG, "onAbilityConnectDone success."); 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 onAbilityDisconnectDone(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。
以上就是关于 HarmonyOS 原子化服务的介绍了,你学会了吗?期待更多开发者小伙伴加入原子化服务开发之旅哦~
网站题目:搞不懂HarmonyOS原子化服务?各位开发者看这里
转载源于:http://www.shufengxianlan.com/qtweb/news9/307509.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联