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
建议不要在主线程中做等待操作,多异步需要考虑时序。
可以使用公共事件来进行数据的传递
参考链接: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
可能不生效,因为该回调在后台执行时可能被系统限制或中断。建议将数据保存操作移至onAbilityForeground
或onAbilityActive
等前台生命周期回调中,以确保操作正常执行。
在HarmonyOS Next中,onAbilityBackground
生命周期回调确实存在异步操作不生效的问题。这是因为当Ability进入后台时,系统会限制后台任务的执行时间,异步操作可能无法完成。
对于保存数据到Preferences的场景,建议:
- 避免在
onAbilityBackground
中执行耗时异步操作 - 将数据保存操作提前到
onWindowStageInactive
等更早的生命周期 - 如果必须在后台保存,可以使用同步API替代异步操作
修改建议:
onAbilityBackground(uiAbility) {
// 使用同步方式保存数据
const preferences = ... // 获取preferences实例
preferences.putSync('key', 'value');
preferences.flushSync();
}
或者考虑在onWindowStageInactive
中完成数据保存:
onWindowStageInactive(uiAbility, windowStage) {
// 在这里执行数据保存
await saveToPreferences();
}
这种设计是出于系统资源管理的考虑,后台Ability的执行时间会受到严格限制。