引言
在HarmonyOS的应用开发中,确保应用的稳定性和可靠性至关重要。当应用遇到未捕获的异常或错误时,系统默认处理方式是终止进程,这可能导致用户数据丢失和工作流程中断。为了改善用户体验,HarmonyOS提供了错误管理和应用故障恢复的接口,允许开发者捕捉异常、记录错误日志,并在必要时恢复应用状态,避免数据丢失。
错误管理
接口概览
错误管理接口由errorManager
模块提供,允许开发者注册监听器以捕捉应用中的未处理异常,并将这些错误上报至开发者的服务平台进行分析和修复。
注册错误监听
const registerId = errorManager.on("error", callback);
解除错误监听
errorManager.off("error", registerId).then(() => {
console.log("[Demo] Listener unregistered successfully.");
}).catch((err) => {
console.error("[Demo] Error while unregistering listener:", err);
});
错误监听回调
当系统检测到未处理的异常时,ErrorObserver
接口的onUnhandledException
方法会被调用。
const callback = {
onUnhandledException: function (errMsg) {
console.log("[Demo] Unhandled exception:", errMsg);
}
};
应用故障恢复
接口概览
应用故障恢复接口由appRecovery
模块提供,允许开发者在应用遇到故障时保存应用状态,并在应用重启时恢复到故障前的状态。
使能应用恢复
appRecovery.enableAppRecovery(
appRecovery.RestartFlag.ALWAYS_RESTART,
appRecovery.SaveOccasionFlag.SAVE_WHEN_ERROR | appRecovery.SaveOccasionFlag.SAVE_WHEN_BACKGROUND,
appRecovery.SaveModeFlag.SAVE_WITH_FILE
);
主动保存应用状态
appRecovery.saveAppState();
重启应用
appRecovery.restartApp();
数据保存与恢复
当saveAppState()
被调用时,框架会回调onSaveState
方法,开发者可以在其中保存数据。重启应用时,数据可以从onCreate
方法的want
参数中恢复。
onSaveState(state, wantParams) {
wantParams["myData"] = "my1234567";
return AbilityConstant.OnSaveResult.ALL_AGREE;
}
onCreate(want, launchParam) {
if (launchParam.launchReason == AbilityConstant.LaunchReason.APP_RECOVERY) {
let recoveryData = want.parameters["myData"];
// 恢复数据
}
}
示例代码
以下是一个结合错误管理和应用故障恢复的示例代码,展示了如何在应用中注册错误监听器,捕捉异常,保存应用状态,并在重启时恢复状态。
import AbilityStage from '@ohos.app.ability.AbilityStage';
import errorManager from '@ohos.app.ability.errorManager';
import appRecovery from '@ohos.app.ability.appRecovery';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import LocalStorage from '@ohos.data.localstorage.LocalStorage';
let registerId = -1;
let callback = {
onUnhandledException: function (errMsg) {
console.log("[Demo] Unhandled exception:", errMsg);
appRecovery.saveAppState();
appRecovery.restartApp();
}
};
export default class EntryAbility extends AbilityStage {
storage: LocalStorage;
onCreate(want, launchParam) {
console.log("[Demo] EntryAbility onCreate");
registerId = errorManager.on("error", callback);
globalThis.abilityWant = want;
if (launchParam.launchReason == AbilityConstant.LaunchReason.APP_RECOVERY) {
this.storage = new LocalStorage();
let recoveryData = want.parameters["myData"];
this.storage.setOrCreate("myData", recoveryData);
this.context.restoreWindowStage(this.storage);
}
}
onDestroy() {
console.log("[Demo] EntryAbility onDestroy");
errorManager.off("error", registerId).then(() => {
console.log("[Demo] Listener unregistered successfully.");
}).catch((err) => {
console.error("[Demo] Error while unregistering listener:", err);
});
}
onSaveState(state, wantParams) {
console.log("[Demo] EntryAbility onSaveState");
wantParams["myData"] = "my1234567";
return AbilityConstant.OnSaveResult.ALL_AGREE;
}
}
结论
通过结合使用errorManager
和appRecovery
模块,HarmonyOS应用开发者可以有效地捕捉并处理应用中的异常,同时在应用遇到故障时保护用户数据,提供更稳定的用户体验。