【harmonyOS】启动框架----优化启动速度和分离初始化代码

启动框架

应用启动时需要初始化相关方法,如果都放在Ability的生命周期中会影响启动速度,当需要初始化的方法过多并且之间存在依赖关系会导致代码难以维护。通过配置启动框架可在异步线程中进行初始化方法并且方法之间结果可依次传递依赖关系更加明确。

添加配置和相关依赖文件

1、module.json5的module中添加appStartup指向配置文件

json 复制代码
{
    "module": {
        "appStartup": "$profile:startup_config"
    }
}

2、resources/base/profile资源目录下新建startup_config.json

json 复制代码
{
  "configEntry": "./ets/startup/StartConfig.ets",
  "startupTasks": [
    {
      "name": "demo01",
      "srcEntry": "./ets/startup/demo01.ets",
      "dependencies": [],
      "runOnThread": "taskPool",
      "waitOnMainThread": false
    }
  ]
}
  • configEntry:管理所有启动任务,可以监听是否成功和任务超时时间
  • startupTasks:
    • name:任务名称唯一标识
    • srcEntry:具体的启动任务方法实现
    • dependencies:当前的启动任务依赖的name
    • runOnThread:当前的启动任务是在主线程或异步线程中执行
    • waitOnMainThread:当前启动任务为异步时,是否等待执行完成然后加载首页

3、ets目录下新建startup目录,存放所有启动任务

ts 复制代码
// ets/startup/StartConfig.ets
import { StartupConfig, StartupConfigEntry } from '@kit.AbilityKit';

export default class StartConfig extends StartupConfigEntry {
  onConfig(): StartupConfig {
    const config:StartupConfig = {
      timeoutMs: 1000,
      startupListener: {
        onCompleted(err) {
          console.info(JSON.stringify(err))
        }
      }
    }
   return config
  }
}
  • timeoutMs:所有启动任务执行完成限制时间
  • startupListener:所有启动任务执行完成调用。执行完成超出timeoutMs时或执行期间任务报错时可获取报错信息

4、具体的启动任务

ts 复制代码
import { common, StartupTask } from '@kit.AbilityKit'
@Sendable
export default class Demo01 extends StartupTask {
  constructor() {
    super()
  }

  async init(context: common.AbilityStageContext): Promise<void | Object> {
    // 启动任务实现...
    console.info('demo01启动')
    return
  }
}

执行顺序:

1、runOnThread为mainThread或taskPool,waitOnMainThread为true时

demo01 -> AbilityStage oncreate -> UIAbility oncreate

AbilityStage为module级别的容器,hap首次加载时执行,可对module初始化。

2、runOnThread为mainThread,waitOnMainThread为false时

AbilityStage oncreate -> demo01 -> UIAbility oncreate

3、runOnThread为taskPool,waitOnMainThread为false时

AbilityStage oncreate -> UIAbility oncreate -> onWindowStageCreate -> demo01

启动任务相互依赖

demo02依赖demo01的执行结果相关配置

json 复制代码
{
  "configEntry": "./ets/startup/StartConfig.ets",
  "startupTasks": [
    {
      "name": "demo01",
      "srcEntry": "./ets/startup/demo01.ets",
      "dependencies": [],
      "runOnThread": "mainThread"
    },
    {
      "name": "demo02",
      "srcEntry": "./ets/startup/demo02.ets",
      "dependencies": [
        "demo01"
      ],
      "runOnThread": "mainThread"
    }
  ]
}

demo01

ts 复制代码
import { common, StartupTask } from '@kit.AbilityKit'
@Sendable
export default class Demo01 extends StartupTask {
  constructor() {
    super()
  }

  async init(context: common.AbilityStageContext): Promise<void | Object> {
    console.info('demo01启动执行')
    const result = 'hello' 
    return result  // demo01的执行结果
  }
}

demo02

ts 复制代码
import { common, StartupTask } from '@kit.AbilityKit'
@Sendable
export default class Demo02 extends StartupTask {
  constructor() {
    super()
  }

  private str: string = ''

  async init(context: common.AbilityStageContext): Promise<void | Object> {
    console.info('demo02启动执行')
    console.info(this.str + ' world')  // hello world
    return
  }

  onDependencyCompleted(dependency: string, result: Object): void {
    console.info(dependency)  // 依赖任务的name demo01
    console.info(JSON.stringify(result)) // 依赖任务的return内容 hello
    this.str = result as string
  }
}

手动模式

启动框架默认为自动执行任务,通过配置也可手动执行

json 复制代码
{
  "configEntry": "./ets/startup/StartConfig.ets",
  "startupTasks": [
    {
      "name": "demo01",
      "srcEntry": "./ets/startup/demo01.ets",
      "dependencies": [],
      "runOnThread": "mainThread",
      "excludeFromAutoStart": true
    }
  ]
}
  • excludeFromAutoStart:是否手动执行
ts 复制代码
Button('按钮').onClick(() => {
  startupManager.run(['demo01'])
})
相关推荐
周胡杰10 分钟前
鸿蒙加载预置数据库-关系型数据库-如何读取本地/预制数据库
数据库·华为·harmonyos·鸿蒙
迷曳10 小时前
27、鸿蒙Harmony Next开发:ArkTS并发(Promise和async/await和多线程并发TaskPool和Worker的使用)
前端·华为·多线程·harmonyos
迷曳14 小时前
24、鸿蒙Harmony Next开发:不依赖UI组件的全局自定义弹出框 (openCustomDialog)
dialog·前端·ui·harmonyos·鸿蒙
平谷一勺21 小时前
鸿蒙状态栏操作
华为·harmonyos·沉浸式状态栏
Georgewu2 天前
【HarmonyOS组件/模板集成创新活动-如何高效开发鸿蒙应用 (鸿社圈子)】
harmonyos
前端世界2 天前
跨平台 App 如何无痛迁移到鸿蒙系统?全流程实战+Demo 教程
华为·harmonyos
龙儿筝2 天前
鸿蒙和Android知识点
android·harmonyos
迷曳2 天前
17、鸿蒙Harmony Next开发:状态管理(组件拥有的状态和应用拥有的状态)
前端·harmonyos·鸿蒙
zhanshuo2 天前
不同品牌的设备也能“心有灵犀”?带你玩转鸿蒙分布式跨端协同
harmonyos
万少3 天前
云测试提前定位和解决问题 萤火故事屋 上架流程
前端·harmonyos·客户端