写点什么

应用卡死后借助 AppRecovery 优雅重生

  • 2026-09-20
    北京
  • 本文字数:2353 字

    阅读完需:约 8 分钟

AI摘要

HarmonyOS 的 AppRecovery 能力可在应用卡死异常退出前自动保存页面栈与用户数据,并于重启后恢复,实现无感故障恢复。

支持状态快照与自动还原;仅需少量适配即可启用;适用于表单填写、支付等关键路径场景。

适合 HarmonyOS 应用开发者、客户端架构师、体验优化工程师阅读。

本原创文章帖发布在华为开发者联盟社区,欢迎开发者前往访问评论交流,更多与该内容相关讨论,请点击原帖查看:应用卡死后借助AppRecovery优雅重生-华为开发者话题 | 华为开发者联盟

前言

相信不少开发者都遇到过这样的场景:用户正在应用中填写一份重要的表单,或者正在进行一笔关键的支付操作,突然应用画面定格、触控无响应——这就是常说的"应用卡死"(AppFreeze)。对于用户而言,这意味着正在进行的工作可能付诸东流;对于开发者而言,这往往意味着用户流失和差评。

好消息是,HarmonyOS 提供了一项名为 AppRecovery 的能力,专门用于应对这类场景。下面就一起来聊聊,如何让应用在发生卡死时能够"优雅地重启",更好地保障用户体验。

什么是 AppRecovery?

AppRecovery 是 HarmonyOS 提供的一项应用故障恢复能力。当应用在运行过程中发生非预期的行为(如 AppFreeze 导致的卡死)时,系统默认会直接退出进程。如果用户在此时有未保存的数据,这些数据就会丢失——这对用户来说是非常糟糕的体验。

而启用了 AppRecovery 的应用则不同。框架会在应用异常退出前自动保存当前状态(包括页面栈、用户数据等),待应用重新启动后,这些数据会被完整恢复,让用户感觉"就像什么都没发生过一样"。

从 API 10 开始,AppRecovery 已经支持应用卡死(AppFreeze)场景下的状态保存与自动重启,这对于需要保障数据安全的应用来说尤为重要。

AppRecovery 核心接口一览

AppRecovery 模块提供了以下关键接口:

调用 enableAppRecovery 后,应用恢复时将按首个支持恢复的 UIAbility 进行恢复。saveAppState 调用后,框架会回调当前进程中所有支持恢复的 UIAbility 的 onSaveState 方法,将相关数据及页面栈持久化到本地缓存。

实战:让应用具备"自愈"能力

下面通过三个步骤,让应用具备 AppFreeze 后的恢复能力。

第一步:使能自恢复特性

在 AbilityStage 的 onCreate 中启用 appRecovery:

import { AbilityStage, appRecovery } from '@kit.AbilityKit';export default class MyAbilityStage extends AbilityStage {    onCreate() {        console.info("[Demo] MyAbilityStage onCreate");        appRecovery.enableAppRecovery(            appRecovery.RestartFlag.ALWAYS_RESTART,            appRecovery.SaveOccasionFlag.SAVE_WHEN_ERROR | appRecovery.SaveOccasionFlag.SAVE_WHEN_BACKGROUND,            appRecovery.SaveModeFlag.SAVE_WITH_FILE        );    }}
复制代码

第二步:配置可恢复的 UIAbility

在 module.json5 中声明支持恢复的 UIAbility:

{    "abilities": [      {        "name": "EntryAbility",        "recoverable": true      }    ]}
复制代码

第三步:实现状态保存与恢复

在 UIAbility 中实现 onSaveState 和 onCreate 方法:

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';let abilityWant: Want;export default class EntryAbility extends UIAbility {    storage: LocalStorage | undefined = undefined;    onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {        console.info("[Demo] EntryAbility onCreate");        abilityWant = want;        // Determine if it is a recovery scenario        if (launchParam.launchReason == AbilityConstant.LaunchReason.APP_RECOVERY) {            this.storage = new LocalStorage();            if (want.parameters) {                let recoveryData = want.parameters["myData"];                this.storage.setOrCreate("myData", recoveryData);                this.context.restoreWindowStage(this.storage);            }        }    }    onSaveState(state: AbilityConstant.StateType, wantParams: Record<string, Object>) {        console.info("[Demo] EntryAbility onSaveState");        wantParams["myData"] = "my1234567";        return AbilityConstant.OnSaveResult.ALL_AGREE;    }}
复制代码

AppFreeze 场景的特殊之处

相比其他故障类型,AppFreeze 有其特殊性:应用主线程处于卡死状态,无法正常执行 JS 代码。为此,API 10 针对 AppFreeze 场景做了特殊处理——onSaveState 回调会在非主线程执行,确保状态能够被正确保存。

这里有几点需要特别注意:

   1. 重启间隔:两次重启的间隔应大于一分钟,否则只会退出不会重启

   2. 线程安全:由于回调不在 JS 线程执行,onSaveState 中禁止访问主线程创建的 thread_local 对象

   3. 状态标记:重启后可以通过 wantConstant.Params.ABILITY_RECOVERY_RESTART 判断是否为恢复场景

为用户打造的"无缝"体验

当 AppRecovery 正确配置后,用户的体验流程是这样的:

   1. 应用发生 AppFreeze,画面冻结

   2. 底层恢复框架检测到故障,触发状态保存

   3. 应用自动重启,onSaveState 中保存的数据被持久化

   4. 应用重新启动,检测到恢复状态,从上次中断的地方继续

整个过程对用户来说,就像经历了一次"快速重启",正在进行的工作得以完整保留。数据不丢,用户自然更信任应用。

写在最后

应用发生卡死是一个小概率但后果严重的事件。通过 AppRecovery 能力,开发者可以为应用增添一道"安全网"——即使面对 AppFreeze 这样的极端场景,也能保障用户数据的完整性,提升应用的整体品质。

如果还没用过 AppRecovery,现在就可以动手试试了。

注:本文档适用于 HarmonyOS API 10 及以上版本。不同版本的功能支持情况可能有所差异,请以官方文档为准。


🔗 官网开发者学堂视频:https://developer.huawei.com/consumer/cn/training/result?type2List=201783644516849879&orderBy=1&courseType=5

🔗 社区 DFX 专题文章: https://developer.huawei.com/consumer/cn/forum/subject/2101218731402391001

【扫码加入 HarmonyOS DFX 技术交流群】