Harmonyos5应用开发实战——应用启动与数据初始化(part1)

163 阅读2分钟

Harmonyos5应用开发实战——应用启动与数据初始化

文章内容概要

本文聚焦于HarmonyOS 5应用开发中应用启动和数据初始化的关键流程。详细介绍了应用启动时如何获取应用数据、应用ID,解析页面路径,获取推送令牌,以及窗口创建时的相关设置等功能,同时阐述了数据预加载和正常加载的实现方式。

核心功能介绍

1. 应用启动与数据获取

在应用启动时,会调用functionPreload方法进行数据预加载。

async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): Promise<void> {
  hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  // 在应用启动时调用函数获取应用数据
  this.functionPreload();
  // ... 其他代码
}

functionPreload方法尝试通过预加载模式获取缓存的应用数据,如果失败则调用functionNormal方法以普通模式从云服务器获取数据。

functionPreload() {
  let promise = cloudFunction.call({
    name: 'preload', // 预加载缓存数据的云函数名称
    timeout: Constants.REQUEST_TIME_OUT, // 获取缓存数据的超时时间
    loadMode: cloudFunction.LoadMode.PRELOAD, // 获取缓存数据必须设置为PRELOAD
  });
  promise.then((data: cloudFunction.FunctionResult) => { // 接口调用成功处理缓存的应用数据
    hilog.info(0x0000, 'testTag', 'get preload cache successfully');
    this.initPreload(data.result as PreloadResponse); // data.result即是缓存的应用数据
  }).catch((err: Error) => {
    hilog.error(0x0000, 'testTag', 'fail to get preload cache: %{public}s', err.message);
    this.functionNormal(); // 使用普通方式获取应用数据
  });
}

functionNormal() {
  hilog.info(0x0000, 'testTag', 'promise start');
  let promise = cloudFunction.call({
    name: 'preload',
    timeout: Constants.REQUEST_TIME_OUT,
    loadMode: cloudFunction.LoadMode.NORMAL, // 默认为NORMAL, 接口会调用云函数从云服务器获取应用数据
  });
  promise.then((data: cloudFunction.FunctionResult) => {
    hilog.info(0x0000, 'testTag', 'call function successfully');
    this.initPreload(data.result as PreloadResponse); // data.result即是缓存的应用数据
  }).catch((err: Error) => {
    hilog.info(0x0000, 'testTag', 'fail to call function: %{public}s', err.message);
  });
}
2. 应用ID获取

通过bundleManager获取应用的包名,并从中提取应用ID。

let bundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_HAP_MODULE |
bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_ABILITY |
bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION);
let packageName = bundleInfo.name;
AppStorage.setOrCreate('packageName', packageName);
console.info(`packageName: ${JSON.stringify(packageName)}.`);
// 元服务包名最后一段为appid
let appId = packageName.substring(packageName.lastIndexOf('.') + 1);
AppStorage.setOrCreate('appId', appId);
console.info(`appId: ${JSON.stringify(appId)}.`);