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

news2024/11/17 1:53:48

概述

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.coloradmin.cn/o/1859194.html

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

相关文章

达梦(DM8)数据库备份与还原(逻辑备份)一

一、达梦数据库的逻辑备份分四种级别的导出&#xff08;dexp&#xff09;与导入&#xff08;dimp&#xff09;的备份 第一种是&#xff1a;数据库级&#xff1a;导出或导入数据库中所有的对象。主要参数是&#xff1a;FULL 第二种是&#xff1a;用户级别&#xff1a;导出或导…

Kafka精要

Apach Kafka 是一款分布式流处理框架&#xff0c;用于实时构建流处理应用。它有一个核心 的功能广为人知&#xff0c;即 作为企业级的消息引擎被广泛使用 kafka设计 Kafka 将消息以 topic 为单位进行归纳 将向 Kafka topic 发布消息的程序成为 producers. 将预订 topics 并消…

实例080 进度条百分比显示

本文仅供学习交流&#xff0c;严禁用于商业用途&#xff0c;如本文涉及侵权请及时联系本人将于及时删除 目录 1.实例说明 2.技术要点 3.实现过程 4.实例结果 5.示例拓展 2.10 进度条控件典型实例进度条控件&#xff08;Progress&#xff09;用于显示程序的进度&#xff0c…

乐鑫云方案研讨会回顾|ESP RainMaker® 引领创业潮,赋能科创企业

近日&#xff0c;乐鑫信息科技 (688018.SH) ESP RainMaker 云生态方案线下研讨会和技术沙龙在深圳成功举办&#xff0c;吸引了众多来自照明电工、新能源、安防、宠物等垂类领域的客户与合作伙伴。活动现场&#xff0c;与会嘉宾围绕产品研发、测试认证、品牌构建、跨境电商等多维…

File文件转Blob文件,临时路径浏览器可查看

fileToBlob (file) { var reader new FileReader(); reader.readAsArrayBuffer(file); reader.onload function (event) { let blob new Blob([event.target.result], { type: file.type }); //{ type: file.type } 预览blob发现乱码可能是type不对 要获取file文件的type …

[C++深入] --- malloc/free和new/delete

1 new运算符的拓展 1.1 自由存储区与堆的概念 在C++中,内存区分为5个区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区。 自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。 new操作符从自由存储区(free st…

qml:导入B站Up主的FluentUI插件

文章目录 文章介绍如何加载1、下载代码2、官方文档和组件介绍 运行FluentUI新建自己的qml项目&#xff0c;并导入FluentUI调用组件&#xff0c;展示效果图 文章介绍 up主“会磨刀的小猪”模仿微软Fluent风格写的界面&#xff0c;可以理解为用qt和qml写出的win10/win11风格的界…

linux 下配置docker mirrors

一、配置mirrors vi /etc/docker/daemon.json {"registry-mirrors": ["https://docker.blfrp.cn"],"log-opts": {"max-size": "10m","max-file": "3"} }#完成配置后重启docker systemctl restart dock…

如何使用 NFTScan NFT API 在 Sei 网络上开发 Web3 应用

Sei Network 是一个专为交易而设计的 Layer 1 区块链。它建立在 Cosmos SDK 上&#xff0c;使用一种称为 Tendermint BFT 的新型共识机制。不仅专攻 DeFi 领域的加密资产交易&#xff0c;更在游戏、社交媒体和 NFTs 等热门 verticals 构建了多功能区块链生态系统。Sei Network …

【财务数字化转型之底座】集团企业财务数据中台系统建设方案

引言&#xff1a;随着企业规模的不断扩大和业务的复杂化&#xff0c;传统的财务管理模式已难以满足集团企业的数据整合、分析和决策需求。因此&#xff0c;建设一个高效、稳定、安全的财务数据中台系统&#xff0c;成为集团企业数字化转型的重要一环。本方案旨在构建一个集数据…

Retrofit类型安全的HTTP客户端库(json)

简介 Retrofit是Square公司开发的一个类型安全的HTTP客户端库&#xff0c;用于Android和Java平台&#xff0c;它使得与Web服务的交互变得更加简单快捷。Retrofit将HTTP API转换成Java接口&#xff0c;让你可以用更简洁的代码形式调用RESTful API&#xff0c;Android网络编程重点…

vue3 element-plus 实现 table表格合并单元格 和 多级表头

多级表头 数据结构比较复杂的时候&#xff0c;可使用多级表头来展现数据的层次关系。 只需要将el-table-column 放置于el-table-column 中&#xff0c;你可以实现组头。 一般可以直接用官网提供的写法&#xff0c;但是有可能数据会比较多的时候&#xff0c;就需要我们稍微改造…

unordered_set和unordered_map

用哈希结构封装map和set 哈希表的改造 节点 数据类型改为模板 迭代器 成员 一个节点的指针&#xff0c;哈希表和下标用来访问&#xff0c;哈希表需要支持修改&#xff0c;传入指针&#xff0c;const为了常迭代器可以传递哈希表 当前节点的next有内容&#xff0c;先遍历…

分布式数据库系统MyCat

MyCat简介 MyCat是一个开源的分布式数据库系统&#xff0c;是一个实现了MySQL协议的服务器&#xff0c;前端用户可以把它看作是一个数据库代理&#xff0c;用MySQL客户端工具和命令行访问&#xff0c;而其后端可以用MySQL原生协议与多个MySQL服务器通信&#xff0c;也可以用JD…

Tita的OKR:如何高效写好一个 OKR ?

OKR 是一个简单而强大的目标设定系统&#xff0c;世界各地的企业都依靠它来提高&#xff08;除其他外&#xff09;对战略、调整和参与的关注度。该系统由目标&#xff08;你想实现的目标&#xff09;和关键结果&#xff08;衡量目标实现情况的量化陈述&#xff09;组成。 目标…

参数页面设计

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 namespace 参数页面设计 {public partial class Form1 : Form{List<PMs> PMs new List<PMs>();public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){for (int …

element-ui table使用type=‘selection‘复选框全禁用-全选禁用_elementui table禁用全选

问题点&#xff1a;当条件数据全被禁用时&#xff0c;全选按钮不是禁用的状态。 复选框全被禁用时&#xff0c;全选按钮将被隐藏 问题总结&#xff1a; 当条件数据全被禁用时&#xff0c;全选按钮也变成禁用的状态&#xff0c;而不是隐藏。有会做的小伙伴希望跟帖。谢谢&#x…

PasteSpiderFile文件同步管理端使用说明(V24.6.21.1)

PasteSpider作为一款适合开发人员的部署管理工具&#xff0c;特意针对开发人员的日常情况做了一个PasteSpiderFile客户端&#xff0c;用于windows上的开发人员迅速的更新发布自己的最新代码到服务器上&#xff01; 虽然PasteSpider也支持svn/git的源码拉取&#xff0c;自动编译…

0802功放2

功放要记一般的式子&#xff0c;而非最大的式子&#xff0c;因为总不能总开到最大音量上工作&#xff0c;而是在比较合适的音量上工作 运放的最大电压也是比电源低1~2V 饱和三极管的功率&#xff0c;电流越大&#xff0c;饱和压降越大&#xff1f;&#xff1f;&#xff1f;不…

SpringBoot优点达项目实战:项目初始化(一)

SpringBoot优点达项目实战&#xff1a;项目初始化&#xff08;一&#xff09; 文章目录 SpringBoot优点达项目实战&#xff1a;项目初始化&#xff08;一&#xff09;1、项目介绍2、项目搭建3、依赖导入4、数据准备 1、项目介绍 技术框架 SpringbootmybatisPlusvueknife 2、项目…