应用启动时通常需要执行一系列初始化启动任务,如果将启动任务都放在应用主模块(即entry类型的Module)的UIAbility组件的onCreate生命周期中,那么只能在主线程中依次执行,不但影响应用的启动速度,而且当启动任务过多时,任务之间复杂的依赖关系还会使得代码难以维护。
AppStartup提供了一种简单高效的应用启动方式,可以支持任务的异步启动,加快应用启动速度。同时,通过在一个配置文件中统一设置多个启动任务的执行顺序以及依赖关系,让执行启动任务的代码变得更加简洁清晰、容易维护。
启动框架支持以自动模式或手动模式执行启动任务,默认采用自动模式。在构造AbilityStage组件容器过程中开始加载开发者配置的启动任务,并执行自动模式的启动任务。开发者也可以在UIAbility创建完后调用startupManager.run方法,执行手动模式的启动任务。

官方链接:
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/app-startup-V5
HMRouter链接介绍:
https://gitee.com/hadss/hmrouter/wikis/如何在启动框架中初始化HMRouter#启动框架初始化hmrouter
启动框架简介
AppStartup提供了一种简单高效的应用启动方式,可以支持任务的异步启动,加快应用启动速度。同时,通过在一个配置文件中统一设置多个启动任务的执行顺序以及依赖关系,让执行启动任务的代码变得更加简洁清晰、容易维护。启动框架详细使用请参考官网,本文仅介绍如何在启动框架初始化HMRouter
应用启动框架AppStartup-Stage模型应用组件-Stage模型开发指导-Ability Kit(程序框架服务)-应用框架 - 华为HarmonyOS开发者 (huawei.com)
- 启动框架初始化HMRouter
2.1 支持版本
支持1.0.0-rc.4以上版本,如果想要在启动框架中初始化HMRouter,请升级到这个版本
2.2 使用启动框架
2.2.1 定义启动框架配置文件
在应用主模块(即entry类型的Module)的"resources/base/profile"路径下,新建启动框架配置文件。文件名可以自定义,本文以"startup_config.json"为例,此处注意,runOnThread的值必须配置为mainThread,配置为taskPool会导致页面无法正常加载。,waitOnMainThread推荐配置为true,配置为false可能会导致首页异常
{
"startupTasks": [
{
"name": "HMRouterInitStartupTask",
"srcEntry": "./ets/startup/HMRouterInitStartupTask.ets",
"runOnThread": "mainThread",
"waitOnMainThread": true
}
],
"configEntry": "./ets/startup/StartupConfig.ets"
}
2.2.2.2 设置启动参数
在"ets/startup/StartupConfig.ets"中设置启动参数,可参考官网启动参数配置
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;
}
}
2.2.2.3 为HMRouter添加启动任务
在"src/main/ets/startup/HMRouterInitStartupTask.ets"中添加启动任务,初始化HMRouter
import { HMRouterMgr } from '@hadss/hmrouter';
import { StartupTask, common } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
@Sendable
export default class HMRouterInitStartupTask extends StartupTask {
constructor() {
super();
}
async init(context: common.AbilityStageContext) {
// add task to init HMRouter
HMRouterMgr.init({
context: context
})
HMRouterMgr.openLog('DEBUG')
}
onDependencyCompleted(dependence: string, result: Object): void {
hilog.info(0x0000, 'testTag', 'HMRouterInitStartupTask onDependencyCompleted, dependence: %{public}s, result: %{public}s',
dependence, JSON.stringify(result));
}
}
这些代码完全可以复制使用的,其实就是按照官方的启动初始化实现的,但是这里我亲自试了,缺少一个配置,无法启动,官方的介绍里面有,需要在module.json5配置文件的appStartup标签中,添加启动框架配置文件的索引。
module.json5示例代码如下。
{
"module": {
"name": "entry",
"type": "entry",
// ...
"appStartup": "$profile:startup_config", // 启动框架的配置文件
// ...
}
}
这样就可以完美实现在启动框架中初始化HMRouter了,当然其他的三方库,你也可以采用这种思路实现初始化。