HarmonyOS鸿蒙Next中onAbilityBackground执行异步方法不生效,比如保存数据到perference里

HarmonyOS鸿蒙Next中onAbilityBackground执行异步方法不生效,比如保存数据到perference里

import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import hilog from '@ohos.hilog';
import UIAbility from '@ohos.app.ability.UIAbility';
import Want from '@ohos.app.ability.Want';
import window from '@ohos.window';
import AbilityLifecycleCallback from '@ohos.app.ability.AbilityLifecycleCallback';

export default class EntryAbility extends UIAbility {
  lifecycleId: number;

  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
    // 定义生命周期回调对象
    let abilityLifecycleCallback:AbilityLifecycleCallback = {
      // 当UIAbility创建时被调用
      onAbilityCreate(uiAbility) {
        hilog.info(0x0000, 'testTag', '%{public}s', `onAbilityCreate uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
      },
      // 当窗口创建时被调用
      onWindowStageCreate(uiAbility, windowStage: window.WindowStage) {
        hilog.info(0x0000, 'testTag', '%{public}s', `onWindowStageCreate uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
        hilog.info(0x0000, 'testTag', '%{public}s', `onWindowStageCreate windowStage: ${JSON.stringify(windowStage)}`);
      },
      // 当窗口处于活动状态时被调用
      onWindowStageActive(uiAbility, windowStage: window.WindowStage) {
        hilog.info(0x0000, 'testTag', '%{public}s', `onWindowStageActive uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
        hilog.info(0x0000, 'testTag', '%{public}s', `onWindowStageActive windowStage: ${JSON.stringify(windowStage)}`);
      },
      // 当窗口处于非活动状态时被调用
      onWindowStageInactive(uiAbility, windowStage: window.WindowStage) {
        hilog.info(0x0000, 'testTag', '%{public}s', `onWindowStageInactive uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
        hilog.info(0x0000, 'testTag', '%{public}s', `onWindowStageInactive windowStage: ${JSON.stringify(windowStage)}`);
      },
      // 当窗口被销毁时被调用
      onWindowStageDestroy(uiAbility, windowStage: window.WindowStage) {
        hilog.info(0x0000, 'testTag', '%{public}s', `onWindowStageDestroy uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
        hilog.info(0x0000, 'testTag', '%{public}s', `onWindowStageDestroy windowStage: ${JSON.stringify(windowStage)}`);
      },
      // 当UIAbility被销毁时被调用
      onAbilityDestroy(uiAbility) {
        hilog.info(0x0000, 'testTag', '%{public}s', `onAbilityDestroy uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
      },
      // 当UIAbility从后台转到前台时触发回调
      onAbilityForeground(uiAbility) {
        hilog.info(0x0000, 'testTag', '%{public}s', `onAbilityForeground uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
      },
      // 当UIAbility从前台转到后台时触发回调
      async onAbilityBackground(uiAbility) {
        hilog.info(0x0000, 'testTag', '%{public}s', `onAbilityBackground uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
        hilog.info(0x0000, 'testTag', '%{public}s', `onAbilityBackground wait start`);
        await this.wait(1000);
        hilog.info(0x0000, 'testTag', '%{public}s', `onAbilityBackground wait end`);
      },
      // 当UIAbility迁移时被调用
      onAbilityContinue(uiAbility) {
        hilog.info(0x0000, 'testTag', '%{public}s', `onAbilityContinue uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
      }
    }
    // 获取应用上下文
    let applicationContext = this.context.getApplicationContext();
    // 注册应用内生命周期回调
    this.lifecycleId = applicationContext.on('abilityLifecycle', abilityLifecycleCallback);
    hilog.info(0x0000, 'testTag', '%{public}s', `register callback number: ${this.lifecycleId}`);
  }

  // 函数实现,参数单位 毫秒 ;
  async wait(ms:number) {
    await this.sleep(ms);
  }

  sleep(ms:number):Promise<void> {
    return new Promise<void>(resolve => setTimeout(() => resolve(), ms));
  }

  onDestroy(): void {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    // Main window is created, set main page for this ability
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
    windowStage.loadContent('pages/Index', (err, data) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
    });
  }

  onWindowStageDestroy(): void {
    // Main window is destroyed, release UI related resources
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground(): void {
    // Ability has brought to foreground
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground(): void {
    // Ability has back to background
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  }
}

更多关于HarmonyOS鸿蒙Next中onAbilityBackground执行异步方法不生效,比如保存数据到perference里的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

建议不要在主线程中做等待操作,多异步需要考虑时序。

可以使用公共事件来进行数据的传递

参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/common-event-overview-V5

更多关于HarmonyOS鸿蒙Next中onAbilityBackground执行异步方法不生效,比如保存数据到perference里的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,onAbilityBackground生命周期回调中执行异步方法如保存数据到Perference可能不生效,因为该回调在后台执行时可能被系统限制或中断。建议将数据保存操作移至onAbilityForegroundonAbilityActive等前台生命周期回调中,以确保操作正常执行。

在HarmonyOS Next中,onAbilityBackground 生命周期回调确实存在异步操作不生效的问题。这是因为当Ability进入后台时,系统会限制后台任务的执行时间,异步操作可能无法完成。

对于保存数据到Preferences的场景,建议:

  1. 避免在onAbilityBackground中执行耗时异步操作
  2. 将数据保存操作提前到onWindowStageInactive等更早的生命周期
  3. 如果必须在后台保存,可以使用同步API替代异步操作

修改建议:

onAbilityBackground(uiAbility) {
  // 使用同步方式保存数据
  const preferences = ... // 获取preferences实例
  preferences.putSync('key', 'value'); 
  preferences.flushSync();
}

或者考虑在onWindowStageInactive中完成数据保存:

onWindowStageInactive(uiAbility, windowStage) {
  // 在这里执行数据保存
  await saveToPreferences();
}

这种设计是出于系统资源管理的考虑,后台Ability的执行时间会受到严格限制。

回到顶部