【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'])
})
相关推荐
maaath5 小时前
【maaath】Flutter for OpenHarmony 跨平台工程集成密码加密能力
flutter·华为·harmonyos
liulian09166 小时前
Flutter for OpenHarmony 混合开发实践:用户反馈功能的实现与适配
flutter·华为·学习方法·harmonyos
Hello__77777 小时前
开源鸿蒙 Flutter 实战|文章分类标签功能全流程实现
flutter·开源·harmonyos
GitCode官方8 小时前
一声唤醒 万物响应|AtomGit 首款开源鸿蒙 AI 硬件「小鸿」发布会圆满落幕 定义智能交互新入口
人工智能·开源·harmonyos
国医中兴9 小时前
Flutter 三方库 nhost_graphql_adapter 的鸿蒙化适配指南 - 云端数据实时对齐、GraphQL 架构实战、鸿蒙级全栈交互专家
flutter·harmonyos·graphql
nashane9 小时前
HarmonyOS 6学习:RCP远场通信流式返回实战——告别“一次性”数据阻塞
学习·华为·harmonyos
李游Leo9 小时前
别把耗时任务都丢进 async:HarmonyOS 里 TaskPool 和 Worker 的边界感
harmonyos
不喝水就会渴9 小时前
HarmonyOS 6.1 新特性:悬浮页签和沉浸光感技术实践
华为·harmonyos
心走9 小时前
鸿蒙OpenGL ES渲染H264花屏问题
harmonyos
IntMainJhy11 小时前
Flutter 三方库 get_it + flutter_bloc 的鸿蒙化适配与实战指南
flutter·华为·harmonyos