应用入口与初始化
概述
HCompass 应用的入口是 EntryAbility.ets,它负责初始化框架、配置服务、注册功能包等核心工作。本文档详细说明应用的启动流程和初始化过程。
EntryAbility 结构
typescript
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void
onWindowStageCreate(windowStage: window.WindowStage): Promise<void>
onDestroy(): void
onWindowStageDestroy(): void
onForeground(): void
onBackground(): void
InitializerFramework(context: common.UIAbilityContext): void
}生命周期方法
onCreate
应用创建时调用,负责初始化框架:
typescript
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
try {
// 设置颜色模式
this.context.getApplicationContext()
.setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);
// 初始化框架
this.InitializerFramework(this.context);
} catch (err) {
hilog.error(DOMAIN, 'testTag', 'Failed to set colorMode. Cause: %{public}s',
JSON.stringify(err));
}
}onWindowStageCreate
窗口创建时调用,负责加载入口页面和初始化 UI:
typescript
async onWindowStageCreate(windowStage: window.WindowStage): Promise<void> {
windowStage.loadContent('view/EntryPage', (_) => {
// 初始化 IBest UI 组件库
IBestUIInitializer.initIBestUI(windowStage, this.context);
});
}onDestroy
应用销毁时调用,负责清理资源:
typescript
onDestroy(): void {
try {
// 销毁所有模块
destroyModules();
} catch (err) {
hilog.error(DOMAIN, 'testTag', 'Failed to destroy modules. Cause: %{public}s',
JSON.stringify(err));
}
}框架初始化流程
InitializerFramework 方法负责初始化整个框架,包括以下步骤:
1. 初始化上下文工具
typescript
// 初始化上下文工具
ContextUtil.init(context);ContextUtil 提供全局的上下文访问能力,其他模块可以通过它获取应用上下文。
2. 初始化数据库
typescript
// 初始化数据库
IBestORMInit(context, { name: "app.db" });使用 IBest-ORM 初始化数据库,数据库名称为 app.db。
3. 配置 DI 容器
typescript
// 获取 DI 容器
const container = getContainer();获取依赖注入容器,用于注册和解析服务。
4. 注册网络配置
typescript
// 注入网络配置
const NetConf: NetworkConfig = {
baseUrl: "https://mall.dusksnow.top/app/",
timeout: 10000,
responseParser: {
successCode: 1000,
dataField: 'data',
messageField: 'message',
codeField: 'code'
},
headers: {
'Content-Type': 'application/json'
},
enableLog: true
};
container.register<NetworkConfig>(CoreServiceKeys.ConfigManager, () => NetConf);配置网络请求的基础参数:
- baseUrl:API 基础地址
- timeout:请求超时时间(毫秒)
- responseParser:响应解析配置
successCode:成功状态码dataField:数据字段名messageField:消息字段名codeField:状态码字段名
- headers:默认请求头
- enableLog:是否启用日志
5. 注册 HTTP 客户端
typescript
// 注入 HTTP 客户端
container.register<AxiosHttpClient>(CoreServiceKeys.HttpClient, () => {
const client = new AxiosHttpClient(NetConf);
// 注册拦截器
client.addInterceptor(new LogInterceptor());
client.addInterceptor(new AuthInterceptor());
return client;
});创建 HTTP 客户端并注册拦截器:
- LogInterceptor:日志拦截器,记录请求和响应
- AuthInterceptor:认证拦截器,添加认证信息
6. 注册功能包
typescript
// 获取模块注册器
const module = getModuleRegistry();
// 注册模块
module.register(createMainModule());
module.register(createAuthModule());
module.register(createUserModule());
module.register(createDemoModule());注册所有功能包模块:
- MainModule:主页功能包
- AuthModule:认证功能包
- UserModule:用户功能包
- DemoModule:示例功能包
完整初始化流程图
应用启动
↓
onCreate
↓
InitializerFramework
├─ 初始化上下文工具 (ContextUtil)
├─ 初始化数据库 (IBest-ORM)
├─ 配置 DI 容器
│ ├─ 注册网络配置
│ └─ 注册 HTTP 客户端
└─ 注册功能包
├─ MainModule
├─ AuthModule
├─ UserModule
└─ DemoModule
↓
onWindowStageCreate
├─ 加载入口页面
└─ 初始化 IBest UI
↓
应用运行自定义初始化
修改网络配置
如果需要修改网络配置,可以在 InitializerFramework 方法中修改 NetConf 对象:
typescript
const NetConf: NetworkConfig = {
baseUrl: "https://your-api.com/", // 修改为你的 API 地址
timeout: 15000, // 修改超时时间
responseParser: {
successCode: 200, // 修改成功状态码
dataField: 'result', // 修改数据字段名
messageField: 'msg', // 修改消息字段名
codeField: 'status' // 修改状态码字段名
},
headers: {
'Content-Type': 'application/json',
'X-Custom-Header': 'value' // 添加自定义请求头
},
enableLog: true
};添加自定义拦截器
如果需要添加自定义拦截器,可以创建一个实现 HttpInterceptor 接口的类:
typescript
// 自定义拦截器
class CustomInterceptor implements HttpInterceptor {
async onRequest(config: AxiosRequestConfig): Promise<AxiosRequestConfig> {
// 请求前处理
return config;
}
async onResponse(response: AxiosResponse): Promise<AxiosResponse> {
// 响应后处理
return response;
}
async onError(error: AxiosError): Promise<AxiosError> {
// 错误处理
return error;
}
}
// 注册拦截器
container.register<AxiosHttpClient>(CoreServiceKeys.HttpClient, () => {
const client = new AxiosHttpClient(NetConf);
client.addInterceptor(new LogInterceptor());
client.addInterceptor(new AuthInterceptor());
client.addInterceptor(new CustomInterceptor()); // 添加自定义拦截器
return client;
});注意事项
1. 初始化顺序
初始化顺序很重要,必须按照以下顺序进行:
- 上下文工具
- 数据库
- DI 容器配置
- 功能包注册
2. 错误处理
所有初始化操作都应该包含错误处理:
typescript
try {
// 初始化操作
} catch (err) {
hilog.error(DOMAIN, 'testTag', 'Error: %{public}s', JSON.stringify(err));
}3. 异步初始化
如果初始化操作是异步的,需要使用 async/await:
typescript
async InitializerFramework(context: common.UIAbilityContext) {
try {
await someAsyncOperation();
} catch (err) {
hilog.error(DOMAIN, 'testTag', 'Error: %{public}s', JSON.stringify(err));
}
}4. 资源清理
在 onDestroy 方法中清理所有资源:
typescript
onDestroy(): void {
try {
// 销毁所有模块
destroyModules();
// 清理其他资源
// ...
} catch (err) {
hilog.error(DOMAIN, 'testTag', 'Failed to destroy. Cause: %{public}s',
JSON.stringify(err));
}
}