聚焦應用常用功能,提升用戶體驗與分發效率

隨著HarmonyOS應用的持續發展,應用的功能將越來越豐富,實際上80%的用戶使用時長都會集中在20%的特性上,其余的功能可能也僅僅是面向部分用戶。
用戶在下載應用時,如果應用包含大量的功能和資源,可能會導致下載時間過長;應用如果包含許多不常用或特定用戶群體才需要的功能,這些功能會占用用戶設備的存儲空間;如果應用體積龐大,啟動和運行速度可能會受到影響。

為了避免用戶首次下載應用耗時過長,及過多占用用戶空間,HarmonyOS SDK 應用市場服務(Store Kit)提供 產品特性按需分發的能力,能夠提供動態分發和資源拆分,支持用戶按需動態下載自己所需的增強特性,減少開發者應用的分發成本,將精力放在維護和分發用戶實際需要的功能模塊,幫助提高分發效率。

基本概念

按需分發:一個應用程序被打包成多個安裝包,安裝包包含了所有的應用程序代碼和靜態資源。用戶從應用市場下載的應用只包含基本功能的安裝包,當用戶需要使用增強功能時,相應安裝包將會從服務器下載到設備上。

開發步驟

獲取模塊安裝信息

1.導入moduleInstallManager模塊及相關公共模塊。

import { moduleInstallManager } from '@kit.StoreKit';

2.構造參數。

入參為需要查詢的模塊名稱。

const moduleName: string = 'AModule';

3.調用getInstalledModule方法,將步驟2中構造的參數傳入模塊中的getInstalledModule方法。

const moduleInfo: moduleInstallManager.InstalledModule = moduleInstallManager.getInstalledModule(moduleName);
創建按需加載的請求實例

1.導入moduleInstallManager模塊及相關公共模塊。

import { moduleInstallManager } from '@kit.StoreKit';
import type { common } from '@kit.AbilityKit';

2.構造參數。

入參為當前應用的上下文context,只支持UIAbilityContext和ExtensionContext類型的上下文,其中UIAbilityContext類型的上下文是要校驗當前應用是否在前臺,如果不在前臺,則會被拒絕調用。

const context: common.UIAbilityContext | common.ExtensionContext = getContext(this) as common.UIAbilityContext;

3.調用createModuleInstallRequest方法,將步驟2中構造的參數依次傳入模塊中的createModuleInstallRequest方法。

const myModuleInstallProvider: moduleInstallManager.ModuleInstallProvider = new moduleInstallManager.ModuleInstallProvider();
const myModuleInstallRequest: moduleInstallManager.ModuleInstallRequest = myModuleInstallProvider.createModuleInstallRequest(context);
請求按需加載的接口

1.導入moduleInstallManager模塊及相關公共模塊。

import type { common } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { moduleInstallManager } from '@kit.StoreKit';

2.構造參數。

入參為當前要按需加載的模塊名。

const moduleNameA: string = 'AModule';
const moduleNameB: string = 'BModule';

3.調用ModuleInstallRequest中的addModule方法,將步驟2中構造的參數依次傳入模塊中的addModule方法。

let myModuleInstallRequest: moduleInstallManager.ModuleInstallRequest;
try {const myModuleInstallProvider: moduleInstallManager.ModuleInstallProvider = new moduleInstallManager.ModuleInstallProvider();const context: common.UIAbilityContext | common.ExtensionContext = getContext(this) as common.UIAbilityContext;myModuleInstallRequest = myModuleInstallProvider.createModuleInstallRequest(context);const aResult: moduleInstallManager.ReturnCode = myModuleInstallRequest.addModule(moduleNameA);const bResult: moduleInstallManager.ReturnCode = myModuleInstallRequest.addModule(moduleNameB);hilog.info(0, 'TAG', 'aResult:' + aResult + ' bResult:' + bResult);
} catch (error) {hilog.error(0, 'TAG', `addModule onError.code is ${error.code}, message is ${error.message}`);
}

4.調用fetchModules方法,將步驟三中的myModuleInstallRequest傳入模塊中的fetchModules方法。

try {moduleInstallManager.fetchModules(myModuleInstallRequest).then((data: moduleInstallManager.ModuleInstallSessionState) => {hilog.info(0, 'TAG', 'Succeeded in fetching Modules data.');})
} catch (error) {hilog.error(0, 'TAG', `fetching Modules onError.code is ${error.code}, message is ${error.message}`);
}
使用動態模塊

假如應用A由entry.hap、AModulelib.hsp兩個包組成,其中entry是基礎包,AModulelib擴展是功能包(創建方式請參考應用程序包開發與使用)。通過應用市場下載安裝只會下載安裝entry包,在entry包里面可以通過fetchModules接口動態下載AModulelib包,并使用動態import技術調用AModulelib里的方法和組件。

AModulelib中主要實現如下:

  • 在動態模塊AModulelib中定義add方法和DateComponent組件。其中add方法用于計算加法,DateComponent用于顯示文本。

Calc.ets定義如下:

export function add(a:number, b:number) {return a + b;
}

DateComponent.ets定義如下:

@Component
struct DateComponent {build() {Column() {Text('我是AModulelib中的組件').margin(10);}.width(300).backgroundColor(Color.Yellow);}
}@Builder
export function showDateComponent() {DateComponent()
}
  • 在AModulelib的AModulelib/Index.ets中導出add方法和showDateComponent方法。
export { add } from './src/main/ets/utils/Calc';
export { showDateComponent } from './src/main/ets/components/DateComponent';

entry中主要實現如下:

  • 在entry基礎模塊中,增加動態依賴配置。entry的oh-package.json5中使用dynamicDependencies來動態依賴AModulelib模塊。
{"dynamicDependencies": {"AModulelib": "file:../AModulelib"}
}
  • 在entry中使用動態模塊AModulelib模塊里面的方法和組件。在調用AModulelib中的功能前需要判斷AModulelib是否已經加載,未加載時請參考請求按需加載的接口完成加載。
import { moduleInstallManager } from '@kit.StoreKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError, Callback } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';
import { promptAction } from '@kit.ArkUI';const TAG: string = 'TAG';@Entry
@Component
struct Index {@BuilderParam AModulelibComponent: Function;@State countTotal: number = 0;@State isShow: boolean = false;build() {Row() {Column() {Button(`調用增量模塊中的add功能:3+6`).onClick(() =&gt; {this.initAModulelib(() =&gt; {import('AModulelib').then((ns: ESObject) =&gt; {this.countTotal = ns.add(3, 6);}).catch((error: BusinessError) =&gt; {hilog.error(0, 'TAG', `add onError.code is ${error.code}, message is ${error.message}`);})})});Text('計算結果:' + this.countTotal).margin(10);Button(`調用增量模塊中的showDateComponent功能`).onClick(() =&gt; {this.initAModulelib(() =&gt; {import('AModulelib').then((ns: ESObject) =&gt; {this.AModulelibComponent = ns.showDateComponent;this.isShow = true;}).catch((error: BusinessError) =&gt; {hilog.error(0, 'TAG', `showDateComponent onError.code is ${error.code}, message is ${error.message}`);})})}).margin({top: 10, bottom: 10});if (this.isShow) {this.AModulelibComponent()}}.width('100%')}.height('100%')}private showToastInfo(msg: string) {promptAction.showToast({message: msg,duration: 2000});}/*** 檢查是否已加載AModulelib包** @param successCallBack 回調*/private initAModulelib(successCallBack: Callback<void>): void {try {const result: moduleInstallManager.InstalledModule = moduleInstallManager.getInstalledModule('AModulelib');if (result?.installStatus === moduleInstallManager.InstallStatus.INSTALLED) {hilog.info(0, TAG, 'AModulelib installed');successCallBack &amp;&amp; successCallBack();} else {// AModulelib模塊未安裝, 需要調用fetchModules下載AModulelib模塊。hilog.info(0, TAG, 'AModulelib not installed');this.fetchModule('AModulelib', successCallBack)}} catch (error) {hilog.error(0, 'TAG', `getInstalledModule onError.code is ${error.code}, message is ${error.message}`);}}/*** 添加監聽事件** @param successCallBack 回調*/private onListenEvents(successCallBack: Callback<void>): void {const timeout = 3 * 60; //單位秒, 默認最大監聽時間為30min(即30*60秒)moduleInstallManager.on('moduleInstallStatus', (data: moduleInstallManager.ModuleInstallSessionState) =&gt; {// 返回成功if (data.taskStatus === moduleInstallManager.TaskStatus.INSTALL_SUCCESSFUL) {successCallBack &amp;&amp; successCallBack();this.showToastInfo('install success');}}, timeout)}/*** 加載指定包** @param moduleName 需要加載的安裝包名稱* @param successCallBack 回調*/private fetchModule(moduleName: string, successCallBack: Callback<void>) {try {hilog.info(0, TAG, 'handleFetchModules start');const context = getContext(this) as common.UIAbilityContext;const moduleInstallProvider: moduleInstallManager.ModuleInstallProvider =new moduleInstallManager.ModuleInstallProvider();const moduleInstallRequest: moduleInstallManager.ModuleInstallRequest =moduleInstallProvider.createModuleInstallRequest(context);if (!moduleInstallRequest) {hilog.warn(0, TAG, 'moduleInstallRequest is empty');return;}moduleInstallRequest.addModule(moduleName);moduleInstallManager.fetchModules(moduleInstallRequest).then((data: moduleInstallManager.ModuleInstallSessionState) =&gt; {hilog.info(0, TAG, 'Succeeded in fetching Modules result.');if (data.code === moduleInstallManager.RequestErrorCode.SUCCESS) {this.onListenEvents(successCallBack)} else {hilog.info(0, TAG, 'fetchModules failure');}}).catch((error: BusinessError) =&gt; {hilog.error(0, 'TAG', `fetchModules onError.code is ${error.code}, message is ${error.message}`);})} catch (error) {hilog.error(0, 'TAG', `handleFetchModules onError.code is ${error.code}, message is ${error.message}`);}}
}

了解更多詳情>>

訪問應用市場服務聯盟官網

獲取產品特性按需分發開發指導文檔

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74879.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74879.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74879.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OCR 識別案例

OCR 識別案例 注意點&#xff1a;輸入圖像尺寸比例盡量和參與模型訓練的數據集比例相似&#xff0c;識別效果會更好。 1、pytesseract Pytesseract是一個Python的光學字符識別&#xff08;OCR&#xff09;工具&#xff0c;它作為Tesseract OCR引擎的封裝&#xff0c;允許你在…

IP大洗牌ipv6強勢來襲!!!【ipv6配置及應用】

前言 隨著時代的發展&#xff0c;IPv4&#xff08;互聯網協議第四版&#xff09;已逐漸無法滿足全球互聯網爆炸式增長的需求。自20世紀80年代誕生以來&#xff0c;IPv4憑借其簡潔的架構和約43億的地址容量&#xff0c;支撐了互聯網的早期擴張。然而&#xff0c;在移動互聯網、物…

OpenAI 推出圖像生成新突破:GPT-4o 實現圖像編輯對話化

關鍵要點 OpenAI 推出了 4o 圖像生成功能&#xff0c;集成于 GPT-4o&#xff0c;提供精準且逼真的圖像生成。 它似乎適用于多種用戶&#xff0c;包括免費用戶&#xff0c;API 訪問預計幾周內推出。 安全措施包括 C2PA 元數據和內容屏蔽&#xff0c;限制生成不適當圖像。 研究…

如何快速對比兩個不同的excel文件中的單元格的數據是否完全相同 并把不同的單元格的背景顏色更改為紅色?

要快速對比兩個不同的Excel文件中的單元格數據是否完全相同&#xff0c;并將不同的單元格背景顏色更改為紅色&#xff0c;可以使用Excel的以下幾種方法&#xff1a; 方法一&#xff1a;使用條件格式 打開兩個Excel文件。將一個文件的內容復制到另一個文件的新工作表中&#x…

口腔種植全流程AI導航系統及輔助診療與耗材智能化編程分析

一、系統架構與編程框架設計 口腔種植全流程人工智能導航系統的開發是一項高度復雜的多學科融合工程,其核心架構需在醫學精準性、工程實時性與臨床實用性之間實現平衡。系統設計以模塊化分層架構為基礎,結合高實時性數據流與多模態協同控制理念,覆蓋從數據采集、智能決策到…

nginx配置頁面緩存,前端每次打包生成新的js文件

前端需要處理的&#xff1a;使用時間戳作為文件名 // nuxt.config.js export default {build: {filenames: {app: ({ isDev }) > isDev ? [name].js : [name].${Date.now()}.js, // 生產環境用時間戳chunk: ({ isDev }) > isDev ? [name].js : [name].${Date.now()}.j…

4.Socket類、InetAddr類、Epoll類實現模塊化

目錄 1. InetAddr類 類定義 代碼說明 類實現 2.Socket類 類定義 類實現 3. Epoll類 類定義 構造與析構函數 方法實現 類實現 4. 使用模塊化設計 示例使用&#xff08;main.cpp) 5. 運行程序 隨著程序復雜度的增加&#xff0c;單一的面向過程的代碼會變得難以理…

視頻生成的測試時Scaling時刻!清華開源Video-T1,無需重新訓練讓性能飆升

來源 | 機器之心 視頻作為包含大量時空信息和語義的媒介&#xff0c;對于 AI 理解、模擬現實世界至關重要。視頻生成作為生成式 AI 的一個重要方向&#xff0c;其性能目前主要通過增大基礎模型的參數量和預訓練數據實現提升&#xff0c;更大的模型是更好表現的基礎&#xff0c…

Go 語言標準庫中time模塊詳細功能介紹與示例

以下是 Go 語言 time 模塊的詳細說明及示例&#xff0c;涵蓋時間操作、定時器、時區處理等核心功能&#xff1a; 一、時間基礎操作 1. 獲取時間 // 當前本地時間 now : time.Now() fmt.Println(now) // 2023-08-04 15:30:45.123456 0800 CST// 構造指定時間 t : time.Date(20…

【強化學習】基于深度強化學習的微能源網能量管理與優化策略研究【Python】

目錄 主要內容 程序要點 2.1 微能源網系統組成 2.2 強化學習及Q學習算法 部分代碼 運行結果 下載鏈接 主要內容 該程序借助深度 Q 網絡&#xff08;DQN&#xff09;&#xff0c;學習預測負荷、風 / 光可再生能源功率輸出及分時電價等環境信息&#xff0c;運用…

dom0-kernel: /thermal-zones/soc_max/cooling-maps/map0: could not find phandle 2

問題描述&#xff1a; 由于soc_max下某個節點找不到&#xff0c;到時dom0-kernel后面有很多有關thermal熱管理之類報錯 問題解決及其原因分析&#xff1a; 這是因為在Xen解析相關節點時&#xff0c;soc_max下的某個節點被跳過了&#xff0c;注釋掉相關的cpu節點處理dom0就可以找…

關于計算機視覺中的插值小記

計算機視覺中的插值&#xff08;Interpolation&#xff09;講解 插值&#xff08;Interpolation&#xff09;在計算機視覺中是一項基礎操作&#xff0c;常用于圖像縮放、旋轉、去噪、圖像重建等任務。其核心思想是在已知數據點之間進行推測&#xff0c;估計未知的像素值或特征…

計算機網絡--傳輸層(1)

第五章 傳輸層 一、傳輸層基本功能 進程到進程的邏輯通信 套接字&#xff08;Socket&#xff09;&#xff1a;IP地址:端口號 IP地址&#xff1a;標識主機&#xff08;網絡層功能&#xff09;端口號&#xff1a;16位整數&#xff08;0-65535&#xff09;&#xff0c;標識進程 熟…

指定 Python 3.12.6-slim 作為基礎鏡像

指定 Python 3.12.6-slim 作為基礎鏡像&#xff0c;意思就是&#xff1a; &#x1f449; 用官方的 Python 3.12.6&#xff08;精簡版&#xff09;作為容器的起點&#xff0c;里面已經有 Python 3.12.6 預裝好了&#xff0c;你不用自己裝。 &#x1f539; 為什么用 -slim&…

【藍橋杯】算法筆記1

1.暴力枚舉 給定一個正整數n,請找出所有滿足a + b = n的整數對(a, b),其中a和b都是正整數,且a ≤ b。 輸入格式:一個正整數n (1 ≤ n ≤ 10?) 輸出格式:所有符合條件的(a, b)對,每行一對,按a的升序排列。如果沒有符合條件的對,輸出"No solution"。 問題分…

專注自習室:番茄工作法實踐

專注自習室&#xff1a;番茄工作法實踐 我需要一個任務管理工具&#xff0c;但在網上找了很多都找不到合適的工具。市面上的大多數產品過于強調任務完成性&#xff0c;給我帶來了很強的心理壓力&#xff0c;這種壓力最終反而降低了我的工作效率。于是我決定自己動手&#xff0…

VUE3項目VITE打包優化

VUE3項目VITE打包優化 代碼加密依賴配置效果對比圖 自動導入依賴配置 代碼壓縮依賴配置效果對比圖 圖片壓縮依賴配置效果對比圖 字體壓縮總結與實踐運用效果 代碼加密 依賴 npm install -D vite-plugin-bundle-obfuscator配置 import vitePluginBundleObfuscator from "…

文章記單詞 | 第14篇(六級)

一&#xff0c;單詞釋義 affection&#xff1a;n. 喜愛&#xff0c;鐘愛&#xff1b;愛慕之情&#xff1b;感情stream&#xff1a;n. 小河&#xff0c;溪流&#xff1b;一連串&#xff0c;源源不斷&#xff1b;水流&#xff0c;氣流&#xff1b;vi. 流&#xff0c;流動&#x…

歐幾里得距離(Euclidean Distance)公式

歐幾里得距離公式 歐幾里得距離&#xff08;Euclidean Distance&#xff09;是計算兩點之間直線距離的一種方法。它是最常見的距離度量方式之一&#xff0c;廣泛應用于數學、物理、機器學習、計算機視覺等領域。 公式定義 1. 二維空間 在二維平面上&#xff0c;假設有兩個點…

機器學習——LightGBM

LightGBM(light gradient boosting machine&#xff0c;輕量梯度提升機)是對XGBoost進行改進的模型版本&#xff0c;其三者之間的演變關系為&#xff1a;GBDT-》XGBoost-》LightGBM&#xff0c;依次對性能進行優化&#xff0c;盡管XGBoost已經很高效了&#xff0c;但是仍然有缺…