RM新时代网站-首页

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

OpenHarmony開(kāi)發(fā)案例:【計(jì)步器卡片】

jf_46214456 ? 來(lái)源:jf_46214456 ? 作者:jf_46214456 ? 2024-04-15 09:22 ? 次閱讀

介紹

本篇Codelab基于Stage模型實(shí)現(xiàn)帶有卡片的計(jì)步應(yīng)用,用于介紹卡片的開(kāi)發(fā)及生命周期實(shí)現(xiàn)。需要完成以下功能:

  1. 消息通知欄,通知用戶(hù)今天所行走步數(shù)。
  2. 元服務(wù)卡片,在桌面上添加2x2或2x4規(guī)格元服務(wù)卡片,能看到步數(shù)變化,也能看到當(dāng)天所行走的進(jìn)度。
  3. 關(guān)系型數(shù)據(jù)庫(kù),用于查詢(xún),添加用戶(hù)行走的數(shù)據(jù)。

StepsCard.gif

相關(guān)概念

  • [消息通知]:提供通知管理的能力,包括發(fā)布、取消發(fā)布通知,創(chuàng)建、獲取、移除通知通道,訂閱、取消訂閱通知,獲取通知的使能狀態(tài)、角標(biāo)使能狀態(tài),獲取通知的相關(guān)信息等。
  • [關(guān)系型數(shù)據(jù)庫(kù)]:關(guān)系型數(shù)據(jù)庫(kù)基于SQLite組件提供了一套完整的對(duì)本地?cái)?shù)據(jù)庫(kù)進(jìn)行管理的機(jī)制,對(duì)外提供了一系列的增、刪、改、查等接口,也可以直接運(yùn)行用戶(hù)輸入的SQL語(yǔ)句來(lái)滿(mǎn)足復(fù)雜的場(chǎng)景需要。
  • [元服務(wù)卡片開(kāi)發(fā)]:卡片是一種界面展示形式,可以將應(yīng)用的重要信息或操作前置到卡片,以達(dá)到服務(wù)直達(dá)、減少體驗(yàn)層級(jí)的目的。
  • 卡片提供方:顯示卡片內(nèi)容,控制卡片布局以及控件點(diǎn)擊事件。
  • 卡片使用方:顯示卡片內(nèi)容的宿主應(yīng)用,控制卡片在宿主中展示的位置。
  • 卡片管理服務(wù):用于管理系統(tǒng)中所添加卡片的常駐代理服務(wù),包括卡片對(duì)象的管理與使用,以及卡片周期性刷新等。

環(huán)境搭建

軟件要求

  • [DevEco Studio]版本:DevEco Studio 3.1 Release。
  • OpenHarmony SDK版本:API version 9。

硬件要求

  • 開(kāi)發(fā)板類(lèi)型:[潤(rùn)和RK3568開(kāi)發(fā)板]。
  • OpenHarmony系統(tǒng):3.2 Release。

搜狗高速瀏覽器截圖20240326151547.png

環(huán)境搭建

完成本篇Codelab我們首先要完成開(kāi)發(fā)環(huán)境的搭建,本示例以RK3568開(kāi)發(fā)板為例,參照以下步驟進(jìn)行:

  1. [獲取OpenHarmony系統(tǒng)版本]:標(biāo)準(zhǔn)系統(tǒng)解決方案(二進(jìn)制)。以3.2 Release版本為例:
  2. 搭建燒錄環(huán)境。
    1. [完成DevEco Device Tool的安裝]
    2. [完成RK3568開(kāi)發(fā)板的燒錄](méi)
  3. 搭建開(kāi)發(fā)環(huán)境。
    1. 開(kāi)始前請(qǐng)參考[工具準(zhǔn)備][qr23.cn/AKFP8k]點(diǎn)擊或者復(fù)制轉(zhuǎn)到,完成DevEco Studio的安裝和開(kāi)發(fā)環(huán)境配置。
    2. 開(kāi)發(fā)環(huán)境配置完成后,請(qǐng)參考[使用工程向?qū)創(chuàng)建工程(模板選擇“Empty Ability”)。
    3. 工程創(chuàng)建完成后,選擇使用[真機(jī)進(jìn)行調(diào)測(cè)]。

代碼結(jié)構(gòu)解讀

本篇Codelab只對(duì)核心代碼進(jìn)行講解,對(duì)于完整代碼,我們會(huì)在gitee中提供。

HarmonyOSOpenHarmony鴻蒙開(kāi)發(fā)文檔
+mau123789v直接領(lǐng)取。

├──entry/src/main/ets            // 代碼區(qū)     
│  ├──common  
│  │  ├──constants
│  │  │  └──CommonConstants.ets  // 常量類(lèi)
│  │  ├──database
│  │  │  ├──Form.ets             // 數(shù)據(jù)庫(kù)卡片操作
│  │  │  └──SensorData.ets       // 數(shù)據(jù)庫(kù)行走步數(shù)操作 
│  │  └──utils
│  │     ├──ChartDataUtils.ets   // 圖表數(shù)據(jù)操作工具類(lèi)  
│  │     ├──DatabaseUtils.ets    // 數(shù)據(jù)庫(kù)工具類(lèi)
│  │     ├──DateUtils.ets        // 日期工具類(lèi)
│  │     ├──GlobalContext.ets    // 項(xiàng)目工具類(lèi)
│  │     └──Logger.ets           // 日志打印工具類(lèi)
│  ├──entryability
│  │  └──EntryAbility.ets        // 程序入口類(lèi)
│  ├──entryformability
│  │  └──EntryFormAbility.ets    // 卡片創(chuàng)建,更新,刪除操作類(lèi)
│  ├──pages
│  │   └──MainPage.ets           // 主界面
│  └──viewmodel
│      ├──ChartPoint.ets         // 圖表點(diǎn)類(lèi)
│      ├──ChartValues.ets        // 圖表值類(lèi)
│      ├──FormData.ets           // 表單數(shù)據(jù)類(lèi)
│      └──PointStyle.ets         // 圖表點(diǎn)樣式類(lèi)
├──entry/src/main/js             // js代碼區(qū)
│  ├──card2x2                    // 2x2卡片目錄
│  ├──card2x4                    // 2x4卡片目錄
│  ├──common                     // 卡片資源目錄
│  └──i18n                       // 卡片國(guó)際化目錄
└──entry/src/main/resources      // 資源文件目錄

關(guān)系型數(shù)據(jù)庫(kù)

元服務(wù)卡片需要用數(shù)據(jù)庫(kù)保存不同時(shí)間、不同卡片的數(shù)據(jù),而且在添加多張卡片情況下,需要保持?jǐn)?shù)據(jù)同步刷新。因此需要?jiǎng)?chuàng)建兩張表,一張是保存卡片信息,另一張是記錄當(dāng)天行走步數(shù)。

  1. 數(shù)據(jù)庫(kù)創(chuàng)建使用的SQLite。
// CommonConstants.ets
  // 表單SQLite
  static readonly CREATE_TABLE_FORM: string = 'CREATE TABLE IF NOT EXISTS Form ' +
    '(id INTEGER PRIMARY KEY AUTOINCREMENT, formId TEXT NOT NULL, formName TEXT NOT NULL, dimension INTEGER)';
  // 行走步數(shù)SQLite
  static readonly CREATE_TABLE_SENSOR_DATA: string = 'CREATE TABLE IF NOT EXISTS SensorData ' +
    '(id INTEGER PRIMARY KEY AUTOINCREMENT, date TEXT NOT NULL, stepsValue INTEGER)';
  1. 在EntryAbility的onCreate方法通過(guò)DatabaseUtils.createRdbStore方法創(chuàng)建數(shù)據(jù)庫(kù),并創(chuàng)建相應(yīng)的表。
// EntryAbility.ets
  onCreate(want: Want, param: AbilityConstant.LaunchParam): void {
    GlobalContext.getContext().setObject('abilityWant', want);
    GlobalContext.getContext().setObject('abilityParam', param);
    DatabaseUtils.createRdbStore(this.context).then((rdbStore: Object | undefined) = > {
      // 添加前三天行走模擬數(shù)據(jù)
      DatabaseUtils.addSimulationData(rdbStore as DataRdb.RdbStore);
    }).catch((error: Error) = > {
      ...
    });
  }

消息通知

需要在MainPage的aboutToAppear調(diào)用requestNotification方法申請(qǐng)通知欄權(quán)限,效果如圖所示:

// MainPage.ets
aboutToAppear() {
  // 申請(qǐng)通知欄權(quán)限
  this.requestNotification();
  ...
}

requestNotification() {
  Notification.requestEnableNotification().then(() = > {
    ...
  }).catch((err: Error) = > {
    ...
  });
}

通過(guò)aboutToAppear的setInterval方法開(kāi)啟定時(shí)器,當(dāng)定時(shí)器到10秒后,通過(guò)DatabaseUtils.sendNotifications方法發(fā)送消息到通知欄。效果如圖所示:

// DatabaseUtils.ets
// 發(fā)送通知
sendNotifications(stepsValue: string, notificationId: number) {
  // 獲取當(dāng)前系統(tǒng)語(yǔ)言
  let notificationBarTitle: string;
  let Language: string = I18n.System.getSystemLanguage();
  // 判斷是否為中文
  if (Language.match(CommonConstants.CHINESE_LANGUAGE)) {
    notificationBarTitle = CommonConstants.NOTIFICATIONS_TITLE_GONE_TODAY_ZH +
        stepsValue + CommonConstants.NOTIFICATIONS_TITLE_STEPS_ZH;
  } else {
    notificationBarTitle = CommonConstants.NOTIFICATIONS_TITLE_GONE_TODAY_EN +
        stepsValue + CommonConstants.NOTIFICATIONS_TITLE_STEPS_EN;
  }
  // 發(fā)布NotificationRequest.
  Notification.publish({
    id: CommonConstants.NOTIFICATIONS_ID,
    content: {
        contentType: Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
        normal: {
          title: notificationBarTitle,
          text: ''
        }
    }
  }).then(() = > {
    ...
  });
}

元服務(wù)卡片

使用元服務(wù)卡片分為四步:創(chuàng)建、初始化、更新、刪除。

創(chuàng)建元服務(wù)卡片目錄

  1. 在main目錄下,點(diǎn)擊鼠標(biāo)右鍵 > New > Service Widget。
  2. 然后選擇第一個(gè)選項(xiàng)下面帶有Hello World字樣,點(diǎn)擊下一步Next。
  3. 填寫(xiě)卡片名字(Service widget name)、卡片介紹(Description)、是否開(kāi)啟低代碼開(kāi)發(fā)(Enable Super Visual)、開(kāi)發(fā)語(yǔ)言(ArkTS和JS)、支持卡片規(guī)格(Support dimension)、關(guān)聯(lián)表單(Ability name)點(diǎn)擊Finish完成創(chuàng)建。如需創(chuàng)建多個(gè)卡片目錄重新按照步驟1執(zhí)行。
  4. 創(chuàng)建完卡片后,同級(jí)目錄出現(xiàn)js目錄,然后開(kāi)發(fā)者在js目錄下使用hml+css+json開(kāi)發(fā)js卡片頁(yè)面。

初始化元服務(wù)卡片

應(yīng)用選擇添加元服務(wù)卡片到桌面后,在EntryFormAbility的onAddForm方法進(jìn)行卡片初始化操作,效果如圖所示:

// EntryFormAbility.ets
onAddForm(want: Want) {
  let formId: string = want.parameters !== undefined ?
    want.parameters[CommonConstants.FORM_PARAM_IDENTITY_KEY] as string : '';
  let formName: string = want.parameters !== undefined ?
    want.parameters[CommonConstants.FORM_PARAM_NAME_KEY] as string : '';
  let dimensionFlag: number = want.parameters !== undefined ?
    want.parameters[CommonConstants.FORM_PARAM_DIMENSION_KEY] as number : 0;
  // 創(chuàng)建數(shù)據(jù)庫(kù)
  DatabaseUtils.createRdbStore(this.context).then((rdbStore: Object | undefined) = > {
    // 存儲(chǔ)卡片信息
    let form: Form = new Form();
    form.formId = formId;
    form.formName = formName;
    form.dimension = dimensionFlag;
    ...
    DatabaseUtils.insertForm(form, rdbStore as DataRdb.RdbStore);
    getToDaySteps(rdbStore as DataRdb.RdbStore, dimensionFlag, formId);
  }).catch((error: Error) = > {
    ...
  });
  ...
  // 初始化卡片數(shù)據(jù)
  let formData: FormData = new FormData();
  formData.percent = 0;
  formData.steps = 0;
  return FormBindingData.createFormBindingData(formData);
};

更新元服務(wù)卡片

  1. 初始化加載主頁(yè)面布局之前,在MainPage的aboutToAppear方法中,調(diào)用setInterval方法開(kāi)啟定時(shí)器。時(shí)間到則先通過(guò)DatabaseUtils.insertValues方法把步數(shù)插入到數(shù)據(jù)庫(kù),再通過(guò)DatabaseUtils.updateForms方法更新卡片步數(shù)。
// MainPage.ets
aboutToAppear() {
  ...
  DatabaseUtils.getSensorData(rdbStoreValue, DateUtils.getDate(0))
    .then((sensorData: SensorData) = > {
      if (sensorData) {
        this.stepsValue = sensorData.stepsValue;
      }
        // 開(kāi)啟定時(shí)器
        this.intervalId = setInterval(() = > {
          ...
          DatabaseUtils.insertValues(this.stepsValue, rdbStoreValue);
          DatabaseUtils.updateForms(this.stepsValue, rdbStoreValue);
        }, CommonConstants.INTERVAL_DELAY_TIME);
      ...
  });
}
  
// DatabaseUtils.ets
updateForms(stepValue: number, rdbStore: DataRdb.RdbStore) {
  let predicates: DataRdb.RdbPredicates =
    new DataRdb.RdbPredicates(CommonConstants.TABLE_FORM);
  // 查詢(xún)卡片
  rdbStore.query(predicates).then((resultSet: DataRdb.ResultSet) = > {
    ...
    // 查詢(xún)第一行
    resultSet.goToFirstRow();
    do {
      let formId: string = resultSet.getString(resultSet.getColumnIndex(CommonConstants.FIELD_FORM_ID));
      let dimension: number = resultSet.getLong(resultSet.getColumnIndex(CommonConstants.FIELD_DIMENSION));
      ChartDataUtils.getFormData(formId, stepValue, dimension, rdbStore)
        .then((formData: FormData) = > {
          // 更新多張卡片
          FormProvider.updateForm(formData.formId, FormBindingData.createFormBindingData(formData))
            .catch((error: Error) = > {
              ...
            });
        }).catch((error: Error) = > {
          ...
        }); 
    } while (resultSet.goToNextRow());
    resultSet.close();
  }).catch((error: Error) = > {
    ...
  });
}
  1. 卡片添加到桌面后,在EntryFormAbility的onAddForm方法中,調(diào)用formProvider.setFormNextRefreshTime方法設(shè)置倒計(jì)時(shí)。時(shí)間到了則通過(guò)updateSensorData方法更新卡片步數(shù)。
// EntryFormAbility.ets
  onAddForm(want: Want) {
    ...
    // 五分鐘倒計(jì)時(shí)
    formProvider.setFormNextRefreshTime(formId, CommonConstants.FIVE_MINUTES, (error, data) = > {
      ...
    });
  }
  
  onUpdateForm(formId: string) {
    // 更新步數(shù)
    this.updateSensorData();
    ...
  }
  
  updateSensorData() {
    DatabaseUtils.createRdbStore(this.context).then((rdbStore: Object | undefined) = > {
      ...
      // 獲取今天步數(shù)
      let getSensorData: Promise< SensorData > =
      DatabaseUtils.getSensorData(rdbStore as DataRdb.RdbStore, DateUtils.getDate(0));
      getSensorData.then((sensorData: SensorData) = > {
        let stepValue: number = 0;
        if (sensorData) {
          stepValue = sensorData.stepsValue;
        }
        // 更新卡片數(shù)據(jù)
        DatabaseUtils.updateForms(stepValue, rdbStore);
      }).catch((error: Error) = > {
        ...
      });
    }).catch((error: Error) = > {
      ...
    });
  }
  1. 通過(guò)src/main/resources/base/profile/form_config.json配置文件,根據(jù)updateDuration或者scheduledUpdateTime字段配置刷新時(shí)間。updateDuration優(yōu)先級(jí)高于scheduledUpdateTime,兩者同時(shí)配置時(shí),以u(píng)pdateDuration配置的刷新時(shí)間為準(zhǔn)。當(dāng)配置的刷新時(shí)間到了,系統(tǒng)調(diào)用onUpdateForm方法進(jìn)行更新。
// form_config.json
  {
    // 卡片的類(lèi)名
    "name": "card2x2",
    // 卡片的描述
    "description": "This is a service widget.",
    // 卡片對(duì)應(yīng)完整路徑 
    "src": "./js/card2x2/pages/index/index",
    // 定義與顯示窗口相關(guān)的配置
    "window": {
      "designWidth": 720,
      "autoDesignWidth": true
    },
    // 卡片的主題樣式
    "colorMode": "auto",
    // 是否為默認(rèn)卡片
    "isDefault": true,
    // 卡片是否支持周期性刷新
    "updateEnabled": true,
    // 采用24小時(shí)制,精確到分鐘
    "scheduledUpdateTime": "00:00",
    // 當(dāng)取值為0時(shí),表示該參數(shù)不生效,當(dāng)取值為正整數(shù)N時(shí),表示刷新周期為30*N分鐘。
    "updateDuration": 1,
    // 卡片默認(rèn)外觀規(guī)格
    "defaultDimension": "2*2",
    // 卡片支持外觀規(guī)格
    "supportDimensions": [
      "2*2"
    ]
  }
  
  // EntryFormAbility.ets
  onUpdateForm(formId: string) {
    // 更新步數(shù)
    updateSensorData();
    ...
  }

刪除元服務(wù)卡片

當(dāng)用戶(hù)需要?jiǎng)h除元服務(wù)卡片時(shí),可以在EntryFormAbility的onRemoveForm方法中,通過(guò)DatabaseUtils.deleteFormData方法刪除數(shù)據(jù)庫(kù)中對(duì)應(yīng)的卡片信息。

// EntryFormAbility.ets
onRemoveForm(formId: string) {
  DatabaseUtils.createRdbStore(this.context).then((rdbStore: Object | undefined) = > {
    ...
    // 刪除數(shù)據(jù)庫(kù)中對(duì)應(yīng)的卡片信息
    DatabaseUtils.deleteFormData(formId, rdbStore as DataRdb.RdbStore);
  }).catch((error: Error) = > {
    ...
  });
}

// DatabaseUtils.ets
deleteFormData(formId: string, rdbStore: DataRdb.RdbStore) {
  let predicates: DataRdb.RdbPredicates = new DataRdb.RdbPredicates(CommonConstants.TABLE_FORM);
  predicates.equalTo(CommonConstants.FIELD_FORM_ID, formId);
  rdbStore.delete(predicates).catch((error: Error) = > {
    ...
  });
}

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3794

    瀏覽量

    64360
  • 計(jì)步器
    +關(guān)注

    關(guān)注

    4

    文章

    76

    瀏覽量

    19912
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1973

    瀏覽量

    30143
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3713

    瀏覽量

    16254
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    TL3588-視頻開(kāi)發(fā)案

    TL3588-視頻開(kāi)發(fā)案
    的頭像 發(fā)表于 01-24 16:29 ?674次閱讀
    TL3588-視頻<b class='flag-5'>開(kāi)發(fā)案</b>例

    TLT507-Linux-RT應(yīng)用開(kāi)發(fā)案

    TLT507-Linux-RT應(yīng)用開(kāi)發(fā)案
    的頭像 發(fā)表于 01-26 09:46 ?696次閱讀
    TLT507-Linux-RT應(yīng)用<b class='flag-5'>開(kāi)發(fā)案</b>例

    鴻蒙OS開(kāi)發(fā)案例:【Stage模型卡片

    本示例展示了Stage模型卡片提供方的創(chuàng)建與使用。
    的頭像 發(fā)表于 04-09 17:13 ?984次閱讀
    鴻蒙OS<b class='flag-5'>開(kāi)發(fā)案</b>例:【Stage模型<b class='flag-5'>卡片</b>】

    OpenHarmony南向開(kāi)發(fā)案例:【分布式畫(huà)板】

    使用OpenHarmony3.1-Release開(kāi)發(fā)的應(yīng)用。通過(guò)OpenHarmony的分布式技術(shù),使多人能夠一起畫(huà)畫(huà)。
    的頭像 發(fā)表于 04-12 14:40 ?1036次閱讀
    <b class='flag-5'>OpenHarmony</b>南向<b class='flag-5'>開(kāi)發(fā)案</b>例:【分布式畫(huà)板】

    3568F-視頻開(kāi)發(fā)案

    3568F-視頻開(kāi)發(fā)案
    的頭像 發(fā)表于 04-12 13:51 ?888次閱讀
    3568F-視頻<b class='flag-5'>開(kāi)發(fā)案</b>例

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

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

    OpenHarmony南向開(kāi)發(fā)案例:【智能油煙機(jī)】

    基于Hi3516開(kāi)發(fā)板,使用開(kāi)源OpenHarmony開(kāi)發(fā)的應(yīng)用。
    的頭像 發(fā)表于 04-18 15:54 ?1047次閱讀
    <b class='flag-5'>OpenHarmony</b>南向<b class='flag-5'>開(kāi)發(fā)案</b>例:【智能油煙機(jī)】

    HarmonyOS與OpenHarmony應(yīng)用開(kāi)發(fā)差異

    DevEco Studio是HarmonyOS的配套的開(kāi)發(fā)IDE,因?yàn)镠armonyOS是基于OpenHarmony開(kāi)發(fā)的,因此,使用DevEco Studio(配套HarmonyOS)也可以進(jìn)行
    發(fā)表于 10-22 10:35

    HarmonyOS/OpenHarmony應(yīng)用開(kāi)發(fā)-FA卡片開(kāi)發(fā)體驗(yàn)

    :HarmonyOSOpenHarmony應(yīng)用開(kāi)發(fā)-FA卡片開(kāi)發(fā)體驗(yàn).docx示例代碼:https://gitee.com/jltfcloudcn/jump_to/tree/maste
    發(fā)表于 12-06 14:48

    HarmonyOS/OpenHarmony元服務(wù)開(kāi)發(fā)-配置卡片的配置文件

    ;supportDimensions\": [ \"2*2\" ] } ] } *附件:HarmonyOSOpenHarmony元服務(wù)開(kāi)發(fā)-配置卡片的配置文件.docx
    發(fā)表于 08-01 11:45

    華為開(kāi)發(fā)者分論壇HarmonyOS學(xué)生公開(kāi)課-OpenHarmony Codelabs開(kāi)發(fā)案

    2021華為開(kāi)發(fā)者分論壇HarmonyOS學(xué)生公開(kāi)課-OpenHarmony Codelabs開(kāi)發(fā)案
    的頭像 發(fā)表于 10-24 11:25 ?1913次閱讀
    華為<b class='flag-5'>開(kāi)發(fā)</b>者分論壇HarmonyOS學(xué)生公開(kāi)課-<b class='flag-5'>OpenHarmony</b> Codelabs<b class='flag-5'>開(kāi)發(fā)案</b>例

    用Java開(kāi)發(fā)HarmonyOS服務(wù)卡片

    卡片服務(wù):由卡片提供方開(kāi)發(fā)者實(shí)現(xiàn),開(kāi)發(fā)者實(shí)現(xiàn) onCreateForm、onUpdateForm 和 onDeleteForm 處理創(chuàng)建卡片
    的頭像 發(fā)表于 04-26 11:04 ?1514次閱讀

    如何在OpenHarmony開(kāi)發(fā)服務(wù)卡片

    本篇文章我們將分享如何在 OpenHarmony開(kāi)發(fā)服務(wù)卡片
    的頭像 發(fā)表于 04-10 11:12 ?1053次閱讀

    RK3568---NPU開(kāi)發(fā)案

    RK3568---NPU開(kāi)發(fā)案
    的頭像 發(fā)表于 01-19 13:50 ?914次閱讀
    RK3568---NPU<b class='flag-5'>開(kāi)發(fā)案</b>例

    OpenHarmony南向開(kāi)發(fā)案例:【智能中控屏】

    基于Hi3516開(kāi)發(fā)板,使用開(kāi)源OpenHarmony開(kāi)發(fā)的應(yīng)用。通過(guò)控制面板可以控制同一局域網(wǎng)內(nèi)的空調(diào),窗簾,燈等智能家居設(shè)備。
    的頭像 發(fā)表于 04-17 16:12 ?383次閱讀
    <b class='flag-5'>OpenHarmony</b>南向<b class='flag-5'>開(kāi)發(fā)案</b>例:【智能中控屏】
    RM新时代网站-首页