0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

用Java開發(fā)HarmonyOS服務卡片

OpenHarmony技術社區(qū) ? 來源:OpenHarmony技術社區(qū) ? 作者:賈葉照 ? 2022-04-26 11:04 ? 次閱讀

看本文章之前需要先熟悉一下原子化服務特征和流程 HarmonyOS-5分鐘教會你原子化服務。

服務卡片(以下簡稱“卡片”)是 FA 的一種界面展示形式,將 FA 的重要信息或操作前置到卡片,以達到服務直達,減少體驗層級的目的。

卡片常用于嵌入到其他應用(當前只支持系統(tǒng)應用)中作為其界面的一部分顯示,并支持拉起頁面,發(fā)送消息等基礎的交互功能??ㄆ褂梅截撠燂@示卡片。

卡片提供方:開發(fā)者僅需作為卡片提供方進行服務卡片內(nèi)容的開發(fā),控制卡片實際顯示的內(nèi)容、控件布局以及控件點擊事件。

卡片使用方:顯示卡片內(nèi)容的宿主應用,控制卡片在宿主中展示的位置。

卡片管理服務:用于管理系統(tǒng)中所添加卡片的常駐代理服務,包括卡片對象的管理與使用,以及卡片周期性刷新等。

明:卡片使用方和提供方不要求常駐運行,在需要添加/刪除/請求更新卡片時,卡片管理服務會拉起卡片提供方獲取卡片信息。

服務卡片的運作機制

先上圖:

ea24f37e-c480-11ec-bce3-dac502259ad0.png

卡片管理服務包含以下模塊:
  • 周期性刷新:在卡片添加后,根據(jù)卡片的刷新策略啟動定時任務周期性觸發(fā)卡片的刷新。

  • 卡片緩存管理:在卡片添加到卡片管理服務后,對卡片的視圖信息進行緩存,以便下次獲取卡片時可以直接返回緩存數(shù)據(jù),降低時延。

  • 卡片生命周期管理:對于卡片切換到后臺或者被遮擋時,暫??ㄆ乃⑿?;以及卡片的升級/卸載場景下對卡片數(shù)據(jù)的更新和清理。

  • 卡片使用方對象管理:對卡片使用方的 RPC 對象進行管理,用于使用方請求進行校驗以及對卡片更新后的回調(diào)處理。

  • 通信適配層:負責與卡片使用方和提供方進行 RPC 通信。

卡片提供方包含以下模塊:
  • 卡片服務:由卡片提供方開發(fā)者實現(xiàn),開發(fā)者實現(xiàn) onCreateForm、onUpdateForm 和 onDeleteForm 處理創(chuàng)建卡片、更新卡片以及刪除卡片等請求,提供相應的卡片服務。

  • 卡片提供方實例管理模塊:由卡片提供方開發(fā)者實現(xiàn),負責對卡片管理服務分配的卡片實例進行持久化管理。

  • 通信適配層:HarmonyOS SDK 提供,負責與卡片管理服務通信,用于將卡片的更新數(shù)據(jù)主動推送到卡片管理服務。

服務卡片開發(fā)簡介

關于服務卡片的接口說明,Java 卡片與 JS 卡片選型,約束與限制可以去官網(wǎng)上查看:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-service-widget-provider-intro-0000001150722105

Java 卡片開發(fā)

這次先來講解 Java 卡片開發(fā),后期會專門用一篇來講解 JS 卡片開發(fā)。

使用 DevEco Studio 創(chuàng)建卡片工程(前面文章已經(jīng)說明,這里不再累述)。

我們先看看配置文件 config.json:

"forms":[
{
"landscapeLayouts":[
"$layout:form_weather_widget_2_2"
],
"isDefault":true,
"scheduledUpdateTime":"10:30",
"defaultDimension":"2*2",
"name":"widget",
"description":"Thisisaservicewidget",
"colorMode":"auto",
"type":"Java",
"supportDimensions":[
"2*2"
],
"portraitLayouts":[
"$layout:form_weather_widget_2_2"
],
"updateEnabled":true,
"updateDuration":1
}
],

①“type”:默認值是 JS,我們需要更改為“Java”代表是一個 Java 卡片。

②“scheduledUpdateTime”:表示卡片的定點刷新的時刻,采用 24 小時制,精確到分鐘。但是我在設置時間點的時候并沒有更新,具體原因待考察。

"scheduledUpdateTime":"10:30",

③“updateEnabled”:表示卡片是否支持周期性刷新,取值范圍:
  • true:表示支持周期性刷。

  • false:表示不支持周期性刷新。

④“updateDuration”:表示卡片定時刷新的更新周期,單位為 30 分鐘,取值為自然數(shù)。
  • 當取值為 0 時,表示該參數(shù)不生效。

  • 當取值為正整數(shù) N 時,表示刷新周期為 30*N 分鐘。

"updateEnabled":true,
"updateDuration":1

設置卡片定時刷新,每 30 分鐘更新一次。

⑤“supportDimensions”:表示卡片支持的外觀規(guī)格,取值范圍:
  • 1*2:表示 1 行 2 列的二宮格。

  • 2*2:表示 2 行 2 列的四宮格。

  • 2*4:表示 2 行 4 列的八宮格。

  • 4*4:表示 4 行 4 列的十六宮格。

⑥“portraitLayouts”:表示卡片外觀規(guī)格對應的豎向布局文件,與 supportDimensions 中的規(guī)格一一對應。僅當卡片類型為 Java 卡片時,需要配置該標簽。

⑦“l(fā)andscapeLayouts”:表示卡片外觀規(guī)格對應的橫向布局文件,與 supportDimensions 中的規(guī)格一一對應。僅當卡片類型為 Java 卡片時,需要配置該標簽。

MainAbility 中覆寫卡片相關回調(diào)函數(shù):
  • onCreateForm(Intent intent)

  • onUpdateForm(long formId)

  • onDeleteForm(long formId)

  • onCastTempForm(long formId)

  • onEventNotify(Map formEvents)

  • onAcquireFormState(Intent intent)

當卡片使用方請求獲取卡片時,卡片提供方會被拉起并調(diào)用 onCreateForm(Intent intent) 回調(diào),intent 中會帶有卡片 ID,卡片名稱,臨時卡片標記和卡片外觀規(guī)格信息。

代碼如下:
protectedProviderFormInfoonCreateForm(Intentintent){
HiLog.info(TAG,"onCreateForm");
//卡片id
longformId=intent.getLongParam(AbilitySlice.PARAM_FORM_IDENTITY_KEY,INVALID_FORM_ID);
//卡片名稱
StringformName=intent.getStringParam(AbilitySlice.PARAM_FORM_NAME_KEY);
//卡片規(guī)格
intdimension=intent.getIntParam(AbilitySlice.PARAM_FORM_DIMENSION_KEY,DEFAULT_DIMENSION_2X2);
HiLog.info(TAG,"onCreateForm:formId="+formId+",formName="+formName+",dimension="+dimension);
//將卡片信息存入數(shù)據(jù)庫
saveFormInfo(formId,formName,dimension);

//開發(fā)者需要根據(jù)卡片的名稱以及外觀規(guī)格獲取對應的xml布局并構造卡片對象,此處ResourceTable.Layout_form_weather_widget_2_2
ProviderFormInfoformInfo=newProviderFormInfo(ResourceTable.Layout_form_weather_widget_2_2,this);
//獲取此 ProviderFormInfo 對象中包含的ComponentProvider數(shù)據(jù)。
ComponentProvidercomponentProvider=formInfo.getComponentProvider();
//設置組件的文本內(nèi)容
componentProvider.setText(ResourceTable.Id_weather_text,"天氣:多云");
componentProvider.setText(ResourceTable.Id_weather_temperature,"溫度:29度");
componentProvider.setText(ResourceTable.Id_weather_ph,"PH值:2.9");
//將ComponentProvider中指定的操作合并到此ProviderFormInfo對象中包含的ComponentProvider對象中
formInfo.mergeActions(componentProvider);
returnformInfo;
}

布局:form_weather_widget_2_2.xml


<DependentLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:background_element="#FFFFFFFF"
ohos:remote="true">

<Image
ohos:height="match_parent"
ohos:width="126vp"
ohos:horizontal_center="true"
ohos:image_src="$media:weather"
ohos:scale_mode="zoom_start"
ohos:top_margin="17vp"/>

<DirectionalLayout
ohos:height="match_content"
ohos:width="match_content"
ohos:align_parent_bottom="true"
ohos:bottom_margin="12vp"
ohos:horizontal_center="true"
ohos:orientation="vertical">

<Text
ohos:id="$+id:weather_text"
ohos:height="match_content"
ohos:width="match_parent"
ohos:text="天氣:晴"
ohos:text_color="#E5000000"
ohos:text_size="12fp"
ohos:text_weight="400"
ohos:top_margin="2vp"
ohos:truncation_mode="ellipsis_at_end"/>

<Text
ohos:id="$+id:weather_temperature"
ohos:height="match_content"
ohos:width="match_parent"
ohos:text="溫度:25度"
ohos:text_color="#99000000"
ohos:text_size="12fp"
ohos:text_weight="400"
ohos:top_margin="2vp"
ohos:truncation_mode="ellipsis_at_end"/>
<Text
ohos:id="$+id:weather_ph"
ohos:height="match_content"
ohos:width="match_parent"
ohos:text="PH值:2.5"
ohos:text_color="#99000000"
ohos:text_size="12fp"
ohos:text_weight="400"
ohos:top_margin="2vp"
ohos:truncation_mode="ellipsis_at_end"/>
DirectionalLayout>
DependentLayout>

ea32d7d2-c480-11ec-bce3-dac502259ad0.png當需要卡片提供方更新數(shù)據(jù)時(如觸發(fā)了定時更新、定點更新或者卡片使用方主動請求更新),卡片提供方獲取最新數(shù)據(jù),并調(diào)用 updateForm 接口更新卡片。

示例如下:

protectedvoidonUpdateForm(longformId){
HiLog.info(TAG,"onUpdateForm");
super.onUpdateForm(formId);
refeshData();
}

/**
*updateforms
*/
privatevoidrefeshData(){
//獲取卡片集合
ListformList=DatabaseUtils.queryForms(this,null);

for(FormInfoformInfo:formList){
ProviderFormInforefesh=newProviderFormInfo(ResourceTable.Layout_form_weather_widget_2_2,this);

ComponentProvidercomponentProvider=refesh.getComponentProvider();
//這里更新的值,實際使用中可根據(jù)自己項目要求設置,比如:隨機獲取一個值
componentProvider.setText(ResourceTable.Id_weather_text,"天氣:多云轉晴");
componentProvider.setText(ResourceTable.Id_weather_temperature,"溫度:30度");
componentProvider.setText(ResourceTable.Id_weather_ph,"PH值:3.0");
try{
//卡片提供方主動更新卡片
updateForm(formInfo.getFormId(),componentProvider);
}catch(FormExceptione){
HiLog.error(TAG,"FormException");
}
}
}

定時更新效果:

ea41873c-c480-11ec-bce3-dac502259ad0.png

總結

實際項目中需要通過網(wǎng)絡獲取數(shù)據(jù),這里只是簡單的模擬數(shù)據(jù)。

只是簡單說明了服務卡片創(chuàng)建的回調(diào)方法實現(xiàn),定點和定時數(shù)據(jù)更新的時機和回調(diào)方法的實現(xiàn),下期會更新關于服務卡片信息持久化、卡片控制事件。

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2943

    瀏覽量

    104105
  • HarmonyOS
    +關注

    關注

    79

    文章

    1946

    瀏覽量

    29739

原文標題:用Java開發(fā)HarmonyOS服務卡片

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區(qū)】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    OpenHarmony開發(fā)案例:【電影卡片

    基于元服務卡片的能力,實現(xiàn)帶有卡片的電影應用,介紹卡片開發(fā)過程和生命周期實現(xiàn)。
    的頭像 發(fā)表于 04-15 17:53 ?1150次閱讀
    OpenHarmony<b class='flag-5'>開發(fā)</b>案例:【電影<b class='flag-5'>卡片</b>】

    OpenHarmony開發(fā)案例:【計步器卡片

    基于Stage模型實現(xiàn)帶有卡片的計步應用,用于介紹卡片開發(fā)及生命周期實現(xiàn)。
    的頭像 發(fā)表于 04-15 09:22 ?609次閱讀
    OpenHarmony<b class='flag-5'>開發(fā)</b>案例:【計步器<b class='flag-5'>卡片</b>】

    鴻蒙OS實戰(zhàn)開發(fā):【多設備自適應服務卡片

    服務卡片的布局和使用,其中卡片內(nèi)容顯示使用了一次開發(fā),多端部署的能力實現(xiàn)多設備自適應。 用到了卡片擴展模塊接口,[@ohos.app.
    的頭像 發(fā)表于 04-09 09:20 ?716次閱讀
    鴻蒙OS實戰(zhàn)<b class='flag-5'>開發(fā)</b>:【多設備自適應<b class='flag-5'>服務</b><b class='flag-5'>卡片</b>】

    拓維信息及旗下開鴻智谷同獲華為HarmonyOS開發(fā)服務商認證

    近日,拓維信息及旗下開鴻智谷雙雙通過華為HarmonyOS開發(fā)服務商認證,成為華為“鴻蒙服務商先鋒計劃”認證級伙伴。秉持共同發(fā)展、共創(chuàng)價值的合作理念,拓維信息、開鴻智谷將攜手華為打造
    的頭像 發(fā)表于 03-29 08:13 ?262次閱讀
    拓維信息及旗下開鴻智谷同獲華為<b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>服務</b>商認證

    鴻蒙OS開發(fā)實例:【手擼服務卡片

    服務卡片指導文檔位于“**開發(fā)/應用模型/Stage模型開發(fā)指導/Stage模型應用組件**”路徑下,說明其極其重要。本篇文章將分享實現(xiàn)服務
    的頭像 發(fā)表于 03-28 22:11 ?1019次閱讀
    鴻蒙OS<b class='flag-5'>開發(fā)</b>實例:【手擼<b class='flag-5'>服務</b><b class='flag-5'>卡片</b>】

    鴻蒙HarmonyOS服務-“文學素養(yǎng)”說明

    1.概述 文學素養(yǎng)將中華傳統(tǒng)文化中的常用漢字解釋,優(yōu)秀的經(jīng)、文、楚辭、漢賦、唐詩、宋詞、原曲、明清小說,多音字,生僻字,成語測試等和HarmonyOS具備的元服務、萬能卡片能力進行融合,嘗試用一種
    發(fā)表于 01-10 10:11

    HarmonyOS開發(fā)案例分享:萬能卡片也能用來玩游戲

    一、前言 作為一名開發(fā)愛好者,從大了講,我學習并進行 HarmonyOS 相關開發(fā)是為了能為鴻蒙生態(tài)建設盡一份綿薄之力,從小了講,就是為了自己的興趣。而萬能卡片是一個讓我非常感興趣的東
    發(fā)表于 12-01 09:35

    鴻蒙原生應用/元服務開發(fā)-AGC分發(fā)如何上架HarmonyOS應用

    應用素材。如果選擇分發(fā)到多設備,請在各設備標簽頁分別上傳對應的應用素材。 7.配置HarmonyOS應用的“應用分類”。 8.配置HarmonyOS應用的“開發(fā)服務信息”。 9.配置
    發(fā)表于 11-24 14:44

    一張服務卡片,三個設計原則,讓HarmonyOS服務卡片獲得更多用戶觸點

    服務是一種基于HarmonyOS API的全新服務提供方式,對于開發(fā)者來說僅需要開發(fā)一次,即可支持多終端設備運行,以鴻蒙萬能
    的頭像 發(fā)表于 11-17 15:43 ?415次閱讀

    鴻蒙原生應用開發(fā)-折疊屏、平板設備服務卡片適配

    一、多設備卡片適配原則 為不同尺寸的卡片提供不同的功能 在卡片開發(fā)過程中請考慮適配不同尺寸的設備,特別是在折疊屏和平板設備上,設備屏幕尺寸的變化直接影響了
    發(fā)表于 11-16 10:10

    爆款元服務!教你如何設計高使用率卡片

    調(diào)試。 三、總結 卡片是信息的濃縮和品牌的放大,好的卡片可以為用戶帶來價值、為開發(fā)者帶來流量,一張好的卡片,美感和實用性缺一不可。本文簡單介紹了一些設計方法,更多設計規(guī)范可以前往
    發(fā)表于 11-15 11:15

    鴻蒙原生應用開發(fā)-元服務分發(fā)方式的調(diào)整及趨勢

    ”?;瑒悠聊?,找到“服務中心”,選擇“服務中心”卡片添加至桌面。桌面點擊卡片即可打開服務中心。 Harm
    發(fā)表于 11-14 16:02

    HarmonyOS鴻蒙原生應用開發(fā)設計- 元服務(原子化服務)圖標

    HarmonyOS設計文檔中,為大家提供了獨特的元服務圖標,開發(fā)者可以根據(jù)需要直接引用。 開發(fā)者直接使用官方提供的元服務圖標內(nèi)容,既可以符合
    發(fā)表于 11-01 16:55

    HarmonyOS鴻蒙原生應用開發(fā)設計- 服務組件庫

    HarmonyOS設計文檔中,為大家提供了一些已經(jīng)設計好的原生服務組件庫,開發(fā)者可以根據(jù)需要直接引用。 開發(fā)者直接使用官方提供的服務組件庫樣
    發(fā)表于 10-24 16:12

    HarmonyOS/OpenHarmony原生應用開發(fā)-華為Serverless服務支持情況(四)

    。借助云存儲服務,您可以無需關心存儲服務器的開發(fā)、部署、運維、擴容等事務,大大降低了應用使用存儲的門檻,讓您可以專注于應用的業(yè)務能力構建,助力您的商業(yè)成功。 是支持HarmonyOS
    發(fā)表于 10-16 14:20