原子化服務的官方解析來啦~

科技前鋒發表於2021-08-27

一直關注我們的小夥伴們肯定聽說過“原子化服務”了,可能有些小夥伴還聽說過“元服務”。元服務,其實就是原子化服務。那麼原子化服務到底是什麼,權威的官方解析來啦~

一、原子化服務是什麼?

我們日常生活中已經習慣了應用的概念,而原子化服務是HarmonyOS面向未來提供的一種使用者程式形態。為什麼需要一種新的使用者程式形態呢?

傳統的應用是以裝置為中心,使用前必須手動安裝應用,這樣導致應用像生了根一樣,牢牢的固定在某個裝置上。而在萬物互聯的時代,人均持有裝置量不斷攀升,裝置和場景的多樣性,每個裝置都需要獨立開發一個應用,先安裝後使用、不同裝置的能力不相容等傳統應用的短板逐步暴露出來。在此背景下,應用提供方和使用者都迫切需要一種新的服務提供方式,使應用開發更簡單、服務(如聽音樂、叫車等)的獲取和使用更便捷,原子化服務也就此誕生。

那麼原子化服務到底是什麼呢?

原子化服務是HarmonyOS提供的一種面向未來的服務方式,是有獨立入口的(使用者可透過點選方式直接觸發)、免安裝的(無需顯式安裝,由系統後臺安裝後即可使用)、可為使用者提供一個或多個便捷服務的使用者應用程式形態。

例如:傳統方式的購物應用,在按照原子化服務理念調整設計後,可以由多個服務直達、免安裝的原子化服務實現,比如“商品瀏覽”、“購物車”、“支付”等。

原子化服務的官方解析來啦

帶您體驗原子化服務

下面讓我帶您體驗一下原子化服務,幫助大家更好地瞭解原子化服務到底是什麼樣的。

2.1多種入口

我們可以透過多種方式發現原子化服務:

  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

  1. 快照

建立工程時,如果開啟了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到了嗎?期待更多的開發者小夥伴們加入我們,開啟您的原子化服務開發之旅哦~


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69997629/viewspace-2789228/,如需轉載,請註明出處,否則將追究法律責任。

相關文章