当前位置: 首页 > news >正文

鸿蒙Ability Kit(程序框架服务)【应用启动框架AppStartup】

应用启动框架AppStartup

概述

AppStartup提供了一种更加简单高效的初始化组件的方式,支持异步初始化组件加速应用的启动时间。使用启动框架应用开发者只需要分别为待初始化的组件实现AppStartup提供的[StartupTask]接口,并在[startup_config]中配置AppStartup之间的依赖关系,启动框架将使用拓扑排序保证各个待初始化组件的初始化顺序。启动框架只支持在entry中使用。

添加配置

应用需要在[module.json5配置文件]中配置appStartup标签, 并指定启动框架的配置文件路径。

{"module": {"name": "entry","type": "entry",..."appStartup": "$profile:startup_config",...}
}

添加启动框架配置文件

应用需要在工程的resource目录下添加启动框架的配置文件,配置文件路径需要与[module.json5配置文件]中appStartup标签指定的路径一致。

示例代码如下所示。

{"startupTasks": [{"name": "StartupTask_001","srcEntry": "./ets/startup/StartupTask_001.ets","dependencies": ["StartupTask_002","StartupTask_003"],"runOnThread": "taskPool","waitOnMainThread": false},{"name": "StartupTask_002","srcEntry": "./ets/startup/StartupTask_002.ets","dependencies": ["StartupTask_004"],"runOnThread": "taskPool","waitOnMainThread": false},{"name": "StartupTask_003","srcEntry": "./ets/startup/StartupTask_003.ets","runOnThread": "taskPool","waitOnMainThread": false},{"name": "StartupTask_004","srcEntry": "./ets/startup/StartupTask_004.ets","runOnThread": "taskPool","waitOnMainThread": false},{"name": "StartupTask_005","srcEntry": "./ets/startup/StartupTask_005.ets","runOnThread": "mainThread","waitOnMainThread": true},{"name": "StartupTask_006","srcEntry": "./ets/startup/StartupTask_006.ets","runOnThread": "mainThread","waitOnMainThread": false,"excludeFromAutoStart": true}],"configEntry": "./ets/startup/StartupConfig.ets"
}

startup_config配置文件标签说明

属性名称含义数据类型是否可缺省
startupTasks待初始化组件配置信息。对象数组该标签不可缺省。
configEntry[StartupConfig]文件路径。字符串该标签不可缺省。

startupTasks标签说明

属性名称含义数据类型是否可缺省
name待初始化组件实现[StartupTask]接口的类名称。对象数组该标签不可缺省。
srcEntry需要加载的组件实现[StartupTask]接口的文件路径。字符串该标签不可缺省。
dependencies当前组件所依赖组件实现[StartupTask]接口的类名称数组。对象数组该标签可缺省,缺省值为空。
excludeFromAutoStart是否排除自动模式。 - true:手动模式。 - false:自动模式。布尔值该标签可缺省,缺省值为false。
waitOnMainThread是否在主线程等待。 - true:主线程等待组件初始化。 - false:主线程不等待组件初始化。布尔值该标签可缺省,缺省值为true。
runOnThread执行初始化所在的线程。 - mainThread:在主线程中执行。 - taskPool:在异步线程中执行。字符串该标签可缺省,缺省值为mainThread

添加启动框架组件

所有待加载组件均要实现[StartupTask]接口,文件放置在工程的ets目录下的startup文件夹下,StartupTask必须添加[Sendable]注解。

import StartupTask from '@ohos.app.appstartup.StartupTask';
import common from '@ohos.app.ability.common';
import hilog from '@ohos.hilog';@Sendable
export default class StartupTask_001 extends StartupTask {constructor() {super();}async init(context: common.AbilityStageContext) {hilog.info(0x0000, 'testTag', 'StartupTask_001 init.');return 'StartupTask_001';}onDependencyCompleted(dependence: string, result: Object): void {hilog.info(0x0000, 'testTag', 'StartupTask_001 onDependencyCompleted, dependence: %{public}s, result: %{public}s',dependence, JSON.stringify(result));}
}

添加启动框架配置

应用需要在工程的ets目录下的startup文件夹下添加启动框架配置,开发者可以在该文件中配置超时时间以及组件初始化的监听器,启动框架配置需要在[StartupConfigEntry]中设置[StartupConfig]与[StartupListener]。

import StartupConfig from '@ohos.app.appstartup.StartupConfig';
import StartupConfigEntry from '@ohos.app.appstartup.StartupConfigEntry';
import StartupListener from '@ohos.app.appstartup.StartupListener';
import hilog from '@ohos.hilog';
import { BusinessError } from '@ohos.base';export default class MyStartupConfigEntry extends StartupConfigEntry {onConfig() {hilog.info(0x0000, 'testTag', `onConfig`);let onCompletedCallback = (error: BusinessError<void>) => {hilog.info(0x0000, 'testTag', `onCompletedCallback`);if (error) {hilog.info(0x0000, 'testTag', 'onCompletedCallback: %{public}d, message: %{public}s', error.code, error.message);} else {hilog.info(0x0000, 'testTag', `onCompletedCallback: success.`);}}let startupListener: StartupListener = {'onCompleted': onCompletedCallback}let config: StartupConfig = {'timeoutMs': 10000,'startupListener': startupListener}return config;}
}

启动组件

AppStartup分别提供了自动和手动两种方式来初始化组件,应用开发者可以根据自己的需求选择合适的初始化方式。

手动模式

手动模式需要应用开发者手动调用[StartupManager]中的[run]方法来手动启动组件的初始化。

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@ohos.base';
import startupManager from '@ohos.app.appstartup.startupManager';export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');let startParams = ['StartupTask_006'];try {startupManager.run(startParams).then(() => {console.log('StartupTest startupManager run then, startParams = ');}).catch((error: BusinessError) => {console.info("StartupTest promise catch error, error = " + JSON.stringify(error));console.info("StartupTest promise catch error, startParams = "+ JSON.stringify(startParams));})} catch (error) {let errMsg = JSON.stringify(error);let errCode: number = error.code;console.log('Startup catch error , errCode= ' + errCode);console.log('Startup catch error ,error= ' + errMsg);}}...
}

自动模式

自动模式应用开发者需要将[startup_config]中的excludeFromAutoStart标签设置为false,当应用启动时启动框架会在abilityStage的onCreate前执行组件初始化。

{"startupTasks": [{"name": "StartupTask_001",..."excludeFromAutoStart": false},...],...
}

相关文章:

  • LeetCode|2331. Evaluate Boolean Binary Tree
  • Linux基础 (十五):TCP 协议特点和UDP协议
  • 06016传感器原理与应用202207
  • R语言数据探索和分析23-公共物品问卷分析
  • 物联网设计竞赛_8_Jetson Orin Nano安装pytorch与torchvision
  • 申请医疗设备注册变更时,需要补充考虑网络安全的情况有哪些?
  • locale本地化库学习
  • Linux应用 sqlite3编程
  • 如何学习自动化测试?(附教程)
  • 【iOS】内存泄漏检查及原因分析
  • 学习分享-注册中心Naocs的优雅上下线
  • axios设置 responseType为 “stream“流式获取后端数据
  • Docker 中运行的 MySQL 数据库与 Docker 外部的管理系统连接
  • blender
  • springboot 3 oauth2认证this.authorizationService.save(authorization)生成token报错异常
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • Bytom交易说明(账户管理模式)
  • CentOS6 编译安装 redis-3.2.3
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Vue2.x学习三:事件处理生命周期钩子
  • Vue组件定义
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 前嗅ForeSpider采集配置界面介绍
  • 区块链技术特点之去中心化特性
  • 主流的CSS水平和垂直居中技术大全
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​​​​​​​​​​​​​​Γ函数
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​HTTP与HTTPS:网络通信的安全卫士
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #HarmonyOS:基础语法
  • #考研#计算机文化知识1(局域网及网络互联)
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转)Sql Server 保留几位小数的两种做法
  • (转)详解PHP处理密码的几种方式
  • ./configure、make、make install 命令
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net 8 发布了,试下微软最近强推的MAUI
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .net core Swagger 过滤部分Api
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET Project Open Day(2011.11.13)
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET 中创建支持集合初始化器的类型
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NET构架之我见