應用啟動框架AppStartup
概述
AppStartup
提供了一種更加簡單高效的初始化組件的方式,支持異步初始化組件加速應用的啟動時間。使用啟動框架應用開發者只需要分別為待初始化的組件實現AppStartup
提供的[StartupTask]接口,并在[startup_config]中配置AppStartup
之間的依賴關系,啟動框架將使用拓撲排序保證各個待初始化組件的初始化順序。啟動框架只支持在entry
中使用。
添加配置
應用需要在[module.json5配置文件]中配置appStartup
標簽, 并指定啟動框架的配置文件路徑。
{"module": {"name": "entry","type": "entry",..."appStartup": "$profile:startup_config",...}
}
添加啟動框架配置文件
應用需要在工程的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","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","runOnThread": "mainThread","waitOnMainThread": true},{"name": "StartupTask_006","srcEntry": "./ets/startup/StartupTask_006.ets","runOnThread": "mainThread","waitOnMainThread": false,"excludeFromAutoStart": true}],"configEntry": "./ets/startup/StartupConfig.ets"
}
startup_config
配置文件標簽說明
屬性名稱 | 含義 | 數據類型 | 是否可缺省 |
---|---|---|---|
startupTasks | 待初始化組件配置信息。 | 對象數組 | 該標簽不可缺省。 |
configEntry | [StartupConfig]文件路徑。 | 字符串 | 該標簽不可缺省。 |
startupTasks
標簽說明
屬性名稱 | 含義 | 數據類型 | 是否可缺省 |
---|---|---|---|
name | 待初始化組件實現[StartupTask]接口的類名稱。 | 對象數組 | 該標簽不可缺省。 |
srcEntry | 需要加載的組件實現[StartupTask]接口的文件路徑。 | 字符串 | 該標簽不可缺省。 |
dependencies | 當前組件所依賴組件實現[StartupTask]接口的類名稱數組。 | 對象數組 | 該標簽可缺省,缺省值為空。 |
excludeFromAutoStart | 是否排除自動模式。 -?true:手動模式。 -?false:自動模式。 | 布爾值 | 該標簽可缺省,缺省值為false。 |
waitOnMainThread | 是否在主線程等待。 -?true:主線程等待組件初始化。 -?false:主線程不等待組件初始化。 | 布爾值 | 該標簽可缺省,缺省值為true。 |
runOnThread | 執行初始化所在的線程。 -?mainThread :在主線程中執行。 -?taskPool :在異步線程中執行。 | 字符串 | 該標簽可缺省,缺省值為mainThread 。 |
添加啟動框架組件
所有待加載組件均要實現[StartupTask]接口,文件放置在工程的ets
目錄下的startup
文件夾下,StartupTask必須添加[Sendable]注解。
import StartupTask from '@ohos.app.appstartup.StartupTask';
import common from '@ohos.app.ability.common';
import hilog from '@ohos.hilog';@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));}
}
添加啟動框架配置
應用需要在工程的ets
目錄下的startup
文件夾下添加啟動框架配置,開發者可以在該文件中配置超時時間以及組件初始化的監聽器,啟動框架配置需要在[StartupConfigEntry]中設置[StartupConfig]與[StartupListener]。
import StartupConfig from '@ohos.app.appstartup.StartupConfig';
import StartupConfigEntry from '@ohos.app.appstartup.StartupConfigEntry';
import StartupListener from '@ohos.app.appstartup.StartupListener';
import hilog from '@ohos.hilog';
import { BusinessError } from '@ohos.base';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
分別提供了自動和手動兩種方式來初始化組件,應用開發者可以根據自己的需求選擇合適的初始化方式。
手動模式
手動模式需要應用開發者手動調用[StartupManager]中的[run]方法來手動啟動組件的初始化。
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@ohos.base';
import startupManager from '@ohos.app.appstartup.startupManager';export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');let startParams = ['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);}}...
}
自動模式
自動模式應用開發者需要將[startup_config]中的excludeFromAutoStart
標簽設置為false
,當應用啟動時啟動框架會在abilityStage的onCreate前執行組件初始化。
{"startupTasks": [{"name": "StartupTask_001",..."excludeFromAutoStart": false},...],...
}