HarmonyOS Next开发学习手册——应用启动框架AppStartup

概述

AppStartup提供了一种简单高效的初始化组件的方式,开发者可以使用AppStartup来显示的设置组件的初始化顺序以及之间的依赖关系,支持异步初始化组件加速应用的启动时间。开发者需要分别为待初始化的组件实现AppStartup提供的 StartupTask 接口,并在 startup_config.json 中配置AppStartup之间的依赖关系,每个StartupTask都是一个等待执行的启动任务,启动框架将使用拓扑排序保证各个启动任务的执行顺序。

说明
启动框架只支持在entry中使用。

开发流程

  1. 开启启动框架AppStartup:在 module.json5配置文件 配置文件中appStartup标签中指定启动框架配置文件的路径。
  2. 编写启动框架配置文件:在启动框架配置文件中,依次添加各个待初始化组件的配置信息,并指定启动框架参数的文件路径。
  3. 为每个待初始化组件添加启动任务:通过实现StartupTask接口,启动框架将会按顺序执行初始化流程。
  4. 设置启动框架参数:在启动框架参数文件中,设置超时时间和组件初始化的监听器等参数。

开发指导

开启启动框架AppStartup

开启启动框架后,当应用启动时系统将会读取开发者实现的配置文件并检查是否存在循环依赖,采用拓扑排序对其进行排序。开发者只需要在 module.json5配置文件 中配置appStartup标签, 并指定启动框架的配置文件路径即可开启启动框架。

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

编写启动框架配置文件

启动框架配置文件将为系统提供 StartupTask 的具体实现路径和参数设置,从而进行读取并执行相应的启动任务。该文件为JSON格式,应放在工程的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","dependencies": ["StartupTask_004"],"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","dependencies": ["StartupTask_006"],"runOnThread": "mainThread","waitOnMainThread": true,"excludeFromAutoStart": true},{"name": "StartupTask_006","srcEntry": "./ets/startup/StartupTask_006.ets","runOnThread": "mainThread","waitOnMainThread": false,"excludeFromAutoStart": true}],"configEntry": "./ets/startup/StartupConfig.ets"
}

图1 上述startup_config.json文件中启动任务依赖关系图

startup_config.json配置文件标签说明

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

startupTasks标签说明

属性名称含义数据类型是否可缺省
name待初始化组件实现 StartupTask 接口的类名称。字符串该标签不可缺省。
srcEntry需要加载的组件实现 StartupTask 接口的文件路径。字符串该标签不可缺省。
dependencies当前组件所依赖组件实现 StartupTask 接口的类名称数组。对象数组该标签可缺省,缺省值为空。
excludeFromAutoStart是否排除自动模式,详细介绍可以查看 组件启动模式 。
* true:手动模式。

false:自动模式。
布尔值该标签可缺省,缺省值为false。
waitOnMainThread是否在主线程等待。
* true:主线程等待组件初始化。
false:主线程不等待组件初始化。
布尔值该标签可缺省,缺省值为true。
runOnThread执行初始化所在的线程。
* mainThread:在主线程中执行。
* taskPool:在异步线程中执行。
字符串该标签可缺省,缺省值为mainThread。

为每个待初始化组件添加启动任务

一个 StartupTask 代表一个启动任务,启动框架通过StartupTask来执行组件初始化的逻辑,StartupTask有 init 和 onDependencyCompleted 两个方法。每个启动任务的功能应尽量单一,该文件路径应与 startup_config 中配置的路径一致。StartupTask必须添加 Sendable 注解。以StartupTask_001为例,示例代码如下。

import { StartupTask, common } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';@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));}
}

设置启动框架参数

StartupConfigEntry 为启动框架的整体公用配置,可以设置超时时间和组件初始化的监听器等参数,监听器可以监听启动任务是否执行成功。启动框架需要分别实现 StartupConfig 与 StartupListener ,文件路径需与 startup_config 中配置的StartupConfig标签路径一致。

import { StartupConfig, StartupConfigEntry, StartupListener } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';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分别提供了自动和手动两种方式来初始化组件,自动模式会在abilityStage的onCreate前执行组件初始化。当某些组件并不需要应用启动前就初始化,而是使用时才进行初始化,开发者可以根据业务需求在应用启动后进行手动调用执行初始化。

自动模式

采用自动模式开发者可以不设置 startup_config 中excludeFromAutoStart标签,或设置为false(excludeFromAutoStart默认为false)。

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

手动模式

手动模式开发者可以调用 StartupManager 中的 run 方法来启动组件的初始化。以onCreate生命周期为例,示例代码如下。

import { AbilityConstant, UIAbility, Want, startupManager } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');let startParams = ['StartupTask_005', '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);}}// ...
}

鸿蒙全栈开发全新学习指南

也为了积极培养鸿蒙生态人才,让大家都能学习到鸿蒙开发最新的技术,针对一些在职人员、0基础小白、应届生/计算机专业、鸿蒙爱好者等人群,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线【包含了大厂APP实战项目开发】

本路线共分为四个阶段:

第一阶段:鸿蒙初中级开发必备技能

在这里插入图片描述

第二阶段:鸿蒙南北双向高工技能基础:gitee.com/MNxiaona/733GH

第三阶段:应用开发中高级就业技术

第四阶段:全网首发-工业级南向设备开发就业技术:gitee.com/MNxiaona/733GH

鸿蒙开发面试真题(含参考答案):gitee.com/MNxiaona/733GH

写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请移步前往小编:gitee.com/MNxiaona/733GH

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/34348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DoubleSummaryStatistics 及其相关类之-简介

1. DoubleSummaryStatistics 使用简介 在Java 8中&#xff0c;DoubleSummaryStatistics 类被引入作为 java.util 包的一部分。它是一个用于收集统计数据&#xff08;如计数、最小值、最大值、和、平均值等&#xff09;的类&#xff0c;特别适用于处理 double 类型的数据。 Do…

【OpenGauss源码学习 —— (ALTER TABLE(修改表空间))】

ALTER TABLE&#xff08;列存删除列&#xff09; ALTER TABLE ... SET TABLESPACEExecChangeTableSpaceForRowTable 函数ATExecSetTableSpace 函数 ExecChangeTableSpaceForRowPartition 函数ATExecSetTableSpaceForPartitionP3 函数 ExecChangeTableSpaceForCStoreTable 函数C…

DeepSeek-Coder-v2击败GPT-4 Turbo,成为竞技场最强开源编码模型!

目录 01 编码与数学击败GPT-4 Turbo 02 深度求索&#xff1a;价格战的导火索 就在刚刚&#xff0c;竞技场排名再次刷新&#xff1a;深度求索的DeepSeek-Coder-v2成为竞技场最强开源编码模型&#xff01; 它在Coding Arena中已攀升至第4名&#xff0c;水平接近GPT-4 Turbo。 没…

mysql的information_schema浅析

information_schema 是 MySQL 中的一个虚拟数据库&#xff0c;它包含了关于 MySQL 服务器的所有元数据。 information_schema 作用 元数据管理&#xff1a;提供关于数据库、表、列、索引、权限等的信息。 性能优化&#xff1a;帮助了解数据库结构和索引使用情况&#xff0c;便…

Latex学习之“usefont”用法

Latex学习之“\usefont”用法 一、通俗的解释 \usefont 是 LaTeX 中的一个命令&#xff0c;用于在文档中临时改变字体&#xff0c;其基本语法如下&#xff1a; \usefont{字体编码}{字体族}{字体系列}{字体形状}这样看起来好像蛮抽象&#xff0c;你可能以及晕了&#xff0c;什…

QT中eventFilter的用途详解

QEventFilter 是 Qt 框架中的一个机制&#xff0c;用于拦截和处理事件。这在 Qt 的事件驱动模型中非常重要&#xff0c;因为它允许我们在事件到达目标对象之前捕获并处理它们。下面是对 QEventFilter 的详细解释&#xff0c;分为几个关键部分&#xff1a; 1. 事件处理机制 在…

Arduino称重传感器和 HX711 放大器(数字秤)

Arduino称重传感器和 HX711 放大器&#xff08;数字秤&#xff09; Arduino with Load Cell and HX711 Amplifier (Digital Scale) In this guide, you’ll learn how to create a digital scale with the Arduino using a load cell and the HX711 amplifier. First, you’l…

队列。。。

目的&#xff1a; 1&#xff0e;掌握队列存储结构的表示和实现方法。 2&#xff0e;掌握队列的入队和出队等基本操作的算法实现。 3&#xff0e;了解队列在解决实际问题中的简单应用。 要求&#xff1a; &#xff08;1&#xff09;根据输入的队列长度n和各元素值建立一个循环队…

Redis-使用 jedis 操作数据

文章目录 1、Jedis简介2、环境准备3、创建maven普通项目,导入如下依赖4、测试JAVA程序和Redis之间的通信 1、Jedis简介 "Jedis" 通常是作为 "Java Redis" 的缩写或简称来理解的。Java Embedded Data Structures Interface 表示 Java嵌入式数据结构接口 2、…

高德行政区查询-综合省市县三级选择跳转

一、需求&#xff1a; 需要使用高德地图进行省市县的一个选择&#xff0c;每选择一次就在地图上对选择的省市县进行定位并画出该区域的范围。 最终效果&#xff1a; 二、准备工作 高德的API的key&#xff1a;两种 三、完整页面代码 综合的是这两篇中的内容&#xff08;不…

19、删除链表的倒数第

1、题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[]示例 …

Vue3从入门到精通

文章目录 前言为什么选择Vue框架Vue是什么?为什么要学习Vue? Vue简介Vue API风格选项式API(Options API)组合式API(Composition API) Vue开发前的准备创建Vue项目 Vue项目目录结构![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/0400cdd482704d4d9ffa8a3a6687b12…

什么是档案业务建设评价

档案业务建设评价是对档案管理机构或部门在档案业务建设方面进行的评估和考核。评价主要根据一定的评价标准和指标&#xff0c;对档案业务的各个方面进行综合评估&#xff0c;包括档案收集、整理、保管、利用等环节&#xff0c;以及档案管理机构的组织管理、技术能力等方面。 评…

猫头虎 分享已解决Error || API Rate Limits: HTTP 429 Too Many Requests

猫头虎 分享已解决Error || API Rate Limits: HTTP 429 Too Many Requests &#x1f42f; 摘要 &#x1f4c4; 大家好&#xff0c;我是猫头虎&#xff0c;一名专注于人工智能领域的博主。在AI开发中&#xff0c;我们经常会遇到各种各样的错误&#xff0c;其中API Rate Limits…

Redis-笔记(视频摘抄:哔哩哔哩博主(感谢!)-遇见狂神)

Redis&#xff08;缓存数据库&#xff0c;有效控制查询&#xff09;是非关系型数据库 缓存穿透、缓存击穿&#xff0c;缓存雪崩 Nosql概述 为什么使用NoSQL 大数据时代&#xff0c;那么什么是大数据&#xff0c;大数据就是一般的数据库没有办法进行分析处理&#xff0c;其中…

算法训练(leetcode)第十六天 | 530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先

刷题记录 530. 二叉搜索树的最小绝对差递归非递归 501. 二叉搜索树中的众数*236. 二叉树的最近公共祖先 530. 二叉搜索树的最小绝对差 leetcode题目地址 如果是一颗普通树&#xff0c;则使用暴力求解法&#xff1a;遍历树并保存树种每个节点的值&#xff0c;排序后找差值最小…

【Unity】数据持久化 PlayerPrefs

1、PlayerPrefs是什么 是unity提供的可以用于存储读取玩家数据的公共类 2、存储相关 2.1 PlayerPrefs的数据存储类似于键值对存储一个键对应一个值 提供了存储3种数据的方法int float string 键: string类型 值: int float string对应3种API PlayerPrefs.SetInt("myAge…

Web 应用开源项目大全

Web 应用开源项目大全结合巴比达内网穿透实现WEB公开访问。 下面是一个Web应用的开源列表。没什么可说的&#xff0c;太疯狂了。尤其是Web 2.0那一堆。我不知道你怎么想&#xff0c;有些开源项目的源码写得挺不好的&#xff0c;尤其是性能方面。或许你会以为改一改他们就可以成…

java构造方法的重载

在java中&#xff0c;与普通方法一样&#xff0c;构造方法也可以重载&#xff0c;在一个类中可以定义多个构造方法&#xff0c;但是要求每个构造方法的参数类型或参数不同。在创建对象时&#xff0c;可以通过调用不同的构造方法为不同属性赋值。 示例代码如下 class Student5…

全球网络战市场规模未来十年将超过万亿元

报告称&#xff0c;网络战市场涉及组件、最终用户和地区&#xff0c;其中组件分为硬件、软件和服务&#xff0c;最终用户分为政府、企业和私人、航空航天和国防、BFSI&#xff08;银行、金融服务和保险&#xff09;、医疗保健等&#xff0c;地区涉及北美、欧洲、亚太地区和拉美…