建设学院网站的意义/互联网营销推广公司

建设学院网站的意义,互联网营销推广公司,医院电子网站建设,功能性的网站建设随着HarmonyOS应用的持续发展,应用的功能将越来越丰富,实际上80%的用户使用时长都会集中在20%的特性上,其余的功能可能也仅仅是面向部分用户。 用户在下载应用时,如果应用包含大量的功能和资源,可能会导致下载时间过长…

随着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.mzph.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;限制生成不适当图像。 研究…

口腔种植全流程AI导航系统及辅助诊疗与耗材智能化编程分析

一、系统架构与编程框架设计 口腔种植全流程人工智能导航系统的开发是一项高度复杂的多学科融合工程,其核心架构需在医学精准性、工程实时性与临床实用性之间实现平衡。系统设计以模块化分层架构为基础,结合高实时性数据流与多模态协同控制理念,覆盖从数据采集、智能决策到…

视频生成的测试时Scaling时刻!清华开源Video-T1,无需重新训练让性能飙升

来源 | 机器之心 视频作为包含大量时空信息和语义的媒介&#xff0c;对于 AI 理解、模拟现实世界至关重要。视频生成作为生成式 AI 的一个重要方向&#xff0c;其性能目前主要通过增大基础模型的参数量和预训练数据实现提升&#xff0c;更大的模型是更好表现的基础&#xff0c…

【强化学习】基于深度强化学习的微能源网能量管理与优化策略研究【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就可以找…

专注自习室:番茄工作法实践

专注自习室&#xff1a;番茄工作法实践 我需要一个任务管理工具&#xff0c;但在网上找了很多都找不到合适的工具。市面上的大多数产品过于强调任务完成性&#xff0c;给我带来了很强的心理压力&#xff0c;这种压力最终反而降低了我的工作效率。于是我决定自己动手&#xff0…

VUE3项目VITE打包优化

VUE3项目VITE打包优化 代码加密依赖配置效果对比图 自动导入依赖配置 代码压缩依赖配置效果对比图 图片压缩依赖配置效果对比图 字体压缩总结与实践运用效果 代码加密 依赖 npm install -D vite-plugin-bundle-obfuscator配置 import vitePluginBundleObfuscator from "…

机器学习——LightGBM

LightGBM(light gradient boosting machine&#xff0c;轻量梯度提升机)是对XGBoost进行改进的模型版本&#xff0c;其三者之间的演变关系为&#xff1a;GBDT-》XGBoost-》LightGBM&#xff0c;依次对性能进行优化&#xff0c;尽管XGBoost已经很高效了&#xff0c;但是仍然有缺…

内网服务器无法通过公网地址访问映射到公网的内网服务

内网服务器无法通过公网地址访问映射到公网的内网服务 问题现象问题原因解决方法总结 前几天遇到一个网络问题&#xff0c;在这里做下记录&#xff0c;希望能帮助到有相同问题的朋友。 问题现象 网络拓扑如上所示&#xff0c;服务器1和服务器2在同一内网&#xff0c;网段均为1…

python每日十题(13)

一般把计算机完成一条指令所花费的时间称为一个指令周期。指令周期越短&#xff0c;指令执行就越快。本题答案为D选项。 顺序程序具有顺序性、封闭性和可再现性的特点&#xff0c;使得程序设计者能够控制程序执行的过程(包括执行顺序、执行时间&#xff09;&#xff0c;对程序执…

多智能体功能分化的核心优势是什么:提升效率,查漏补缺

多智能体功能分化的核心优势是什么:提升效率,查漏补缺 在于通过分工协作提升整体效率、灵活性和鲁棒性。 1. 提升效率与专业性 原理:单一智能体无需处理全流程,通过专业化分工减少冗余计算和决策延迟。 示例: 自动驾驶系统: 感知智能体:专门处理摄像头、激光雷达等传…

COMPASS:通过残差强化学习和技能合成实现跨具身移动策略

25年2月来自 Nvidia、UC Berkeley 和 UT Austin 的论文“COMPASS: Cross-embOdiment Mobility Policy via ResiduAl RL and Skill Synthesis”。 随着机器人越来越多地部署在不同的应用领域&#xff0c;可泛化的跨具身移动策略变得越来越重要。虽然经典的移动栈已被证明在特定…

无人机,雷达定点飞行时,位置发散,位置很飘,原因分析

参考&#xff1a; 无人车传感器 IMU与GPS数据融合进行定位机制_gps imu 组合定位原始数-CSDN博客 我的无人机使用雷达定位&#xff0c;位置模式很飘 雷达的更新频率也是10HZ&#xff0c; 而px飞控的频率是100HZ&#xff0c;没有对两者之间的频率差异做出处理 所以才导致无人…

学习threejs,使用Sprite精灵、SpriteMaterial精灵材质

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Sprite1.1.1 ☘️代码…

外星人入侵(python设计小游戏)

这个游戏简而言之就是操作一个飞机对前方的飞船进行射击&#xff0c;和一款很久之前的游戏很像&#xff0c;这里是超级低配版那个游戏&#xff0c;先来看看效果图&#xff1a; 由于设计的是全屏的&#xff0c;所以电脑不能截图。。。。 下面的就是你操控的飞船&#xff0c;上面…

23种设计模式-备忘录(Memento)设计模式

备忘录设计模式 &#x1f6a9;什么是备忘录设计模式&#xff1f;&#x1f6a9;备忘录设计模式的特点&#x1f6a9;备忘录设计模式的结构&#x1f6a9;备忘录设计模式的优缺点&#x1f6a9;备忘录设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是…

某鱼、某宝 sign 签名算法分析记录

【作者主页】&#xff1a;小鱼神1024 【知识星球】&#xff1a;小鱼神的逆向编程圈 【擅长领域】&#xff1a;JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等 本文章中所有内容仅供学习交流使用&#xff0c;不用于其…

【C语言】分支与循环(上)

前言&#xff1a;C语言是由顺序结构、选择结构、循环结构组成的结构化的程序设计语言。 那C语言是如何设计和实现这些结构的呢&#xff1f;话不多说&#xff0c;马上开始。 三种结构如图所示&#xff1a; 我们可以使用 if else语句、 switch语句 来实现选择&#xff08;分支&am…