Skip to content

应用入口与初始化

概述

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. 初始化顺序

初始化顺序很重要,必须按照以下顺序进行:

  1. 上下文工具
  2. 数据库
  3. DI 容器配置
  4. 功能包注册

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));
  }
}

下一步