應(yīng)用啟動(dòng)框架AppStartup
概述
AppStartup
提供了一種更加簡(jiǎn)單高效的初始化組件的方式,支持異步初始化組件加速應(yīng)用的啟動(dòng)時(shí)間。使用啟動(dòng)框架應(yīng)用開(kāi)發(fā)者只需要分別為待初始化的組件實(shí)現(xiàn)AppStartup
提供的[StartupTask]接口,并在[startup_config]中配置AppStartup
之間的依賴(lài)關(guān)系,啟動(dòng)框架將使用拓?fù)渑判虮WC各個(gè)待初始化組件的初始化順序。啟動(dòng)框架只支持在entry
中使用。
添加配置
應(yīng)用需要在[module.json5配置文件]中配置appStartup
標(biāo)簽, 并指定啟動(dòng)框架的配置文件路徑。
{
"module": {
"name": "entry",
"type": "entry",
...
"appStartup": "$profile:startup_config",
...
}
}
添加啟動(dòng)框架配置文件
應(yīng)用需要在工程的resource
目錄下添加啟動(dòng)框架的配置文件,配置文件路徑需要與[module.json5配置文件]中appStartup
標(biāo)簽指定的路徑一致。
示例代碼如下所示。
{
"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
配置文件標(biāo)簽說(shuō)明
屬性名稱(chēng) | 含義 | 數(shù)據(jù)類(lèi)型 | 是否可缺省 |
---|---|---|---|
startupTasks | 待初始化組件配置信息。 | 對(duì)象數(shù)組 | 該標(biāo)簽不可缺省。 |
configEntry | [StartupConfig]文件路徑。 | 字符串 | 該標(biāo)簽不可缺省。 |
startupTasks
標(biāo)簽說(shuō)明
屬性名稱(chēng) | 含義 | 數(shù)據(jù)類(lèi)型 | 是否可缺省 |
---|---|---|---|
name | 待初始化組件實(shí)現(xiàn)[StartupTask]接口的類(lèi)名稱(chēng)。 | 對(duì)象數(shù)組 | 該標(biāo)簽不可缺省。 |
srcEntry | 需要加載的組件實(shí)現(xiàn)[StartupTask]接口的文件路徑。 | 字符串 | 該標(biāo)簽不可缺省。 |
dependencies | 當(dāng)前組件所依賴(lài)組件實(shí)現(xiàn)[StartupTask]接口的類(lèi)名稱(chēng)數(shù)組。 | 對(duì)象數(shù)組 | 該標(biāo)簽可缺省,缺省值為空。 |
excludeFromAutoStart | 是否排除自動(dòng)模式。 - true:手動(dòng)模式。 - false:自動(dòng)模式。 | 布爾值 | 該標(biāo)簽可缺省,缺省值為false。 |
waitOnMainThread | 是否在主線程等待。 - true:主線程等待組件初始化。 - false:主線程不等待組件初始化。 | 布爾值 | 該標(biāo)簽可缺省,缺省值為true。 |
runOnThread | 執(zhí)行初始化所在的線程。 -mainThread :在主線程中執(zhí)行。 -taskPool :在異步線程中執(zhí)行。 | 字符串 | 該標(biāo)簽可缺省,缺省值為mainThread 。 |
添加啟動(dòng)框架組件
所有待加載組件均要實(shí)現(xiàn)[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));
}
}
添加啟動(dòng)框架配置
應(yīng)用需要在工程的ets
目錄下的startup
文件夾下添加啟動(dòng)框架配置,開(kāi)發(fā)者可以在該文件中配置超時(shí)時(shí)間以及組件初始化的監(jiān)聽(tīng)器,啟動(dòng)框架配置需要在[StartupConfigEntry]中設(shè)置[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;
}
}
啟動(dòng)組件
AppStartup
分別提供了自動(dòng)和手動(dòng)兩種方式來(lái)初始化組件,應(yīng)用開(kāi)發(fā)者可以根據(jù)自己的需求選擇合適的初始化方式。
手動(dòng)模式
手動(dòng)模式需要應(yīng)用開(kāi)發(fā)者手動(dòng)調(diào)用[StartupManager]中的[run]方法來(lái)手動(dòng)啟動(dòng)組件的初始化。
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);
}
}
...
}
`HarmonyOS與OpenHarmony鴻蒙文檔籽料:mau123789是v直接拿`
自動(dòng)模式
自動(dòng)模式應(yīng)用開(kāi)發(fā)者需要將[startup_config]中的excludeFromAutoStart
標(biāo)簽設(shè)置為false
,當(dāng)應(yīng)用啟動(dòng)時(shí)啟動(dòng)框架會(huì)在abilityStage的onCreate前執(zhí)行組件初始化。
{
"startupTasks": [
{
"name": "StartupTask_001",
...
"excludeFromAutoStart": false
},
...
],
...
}
審核編輯 黃宇
-
框架
+關(guān)注
關(guān)注
0文章
403瀏覽量
17502 -
鴻蒙
+關(guān)注
關(guān)注
57文章
2358瀏覽量
42876
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論