1# UIAbility备份恢复 2 3## 场景介绍 4 5当应用后台运行时,可能由于系统资源管控等原因导致应用关闭、进程退出,应用直接退出可能会导致用户数据丢失。如果应用在[UIAbilityContext](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md)中启用了[UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md)备份恢复功能,并对临时数据进行保存,则可以在应用退出后的下一次启动时恢复先前的状态和数据(包括应用的页面栈以及[onSaveState](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md#uiabilityonsavestate)接口中保存的数据),从而保证用户体验的连贯性。 6 7> **说明:** 8> 9> 应用正常关闭时,不会触发[UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md)备份流程。应用正常启动(例如通过startAbility接口启动或点击图标启动),不触发[UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md)恢复流程。 10 11## 运行机制 12- [UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md)数据备份:在应用的[onBackground](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md#uiabilityonbackground)生命周期后,系统自动调用[onSaveState](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md#uiabilityonsavestate)进行备份。 13- [UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md)数据恢复:恢复的[Want](../reference/apis-ability-kit/js-apis-app-ability-want.md)数据可以在应用的[onCreate](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md#uiabilityoncreate)生命周期中获取,页面栈数据在应用的[onWindowStageCreate](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md#uiabilityonwindowstagecreate)生命周期中恢复。 14 15## 约束限制 16 17- [UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md)备份恢复支持多实例,备份数据保存7天,以文件的形式存储在应用的沙箱路径中。 18 19- 备份数据以[WantParams](../reference/apis-ability-kit/js-apis-app-ability-want.md)形式存储,由于序列化大小限制,支持的最大数据量为200KB。 20 21- 重启设备不支持还原备份。 22 23- [UIExtensionAbility](../reference/apis-ability-kit/js-apis-app-ability-uiExtensionAbility.md)不支持备份恢复。 24 25## 接口说明 26 27[UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md)备份恢复接口由[UIAbilityContext](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md)模块提供,开发者可以通过在[UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md)中通过this.context直接调用,详见[开发步骤](#开发步骤)。 28 29| 接口名称 | 说明 | 30| ------------------------------------------------------------ | ---------------------------------------------------- | 31| setRestoreEnabled(enabled: boolean): void | 设置当[UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md)从后台切换回时是否启用恢复。| 32 33**[setRestoreEnabled](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextsetrestoreenabled14):** 需要在应用初始化阶段调用([onForeground](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md#uiabilityonforeground)前),比如[UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md)的[onCreate](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md#uiabilityoncreate)调用。 34 35 36## 开发步骤 37 38开发者需要在应用模块初始化时启用[UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md)备份恢复功能。示例如下。 39 40```ts 41import { UIAbility } from '@kit.AbilityKit'; 42 43export default class EntryAbility extends UIAbility { 44 onCreate() { 45 console.info("[Demo] EntryAbility onCreate"); 46 this.context.setRestoreEnabled(true); 47 } 48} 49``` 50 51开发者主动保存数据,在UIAbility启动时恢复。下面为示例。 52 53```ts 54import { AbilityConstant,UIAbility,Want } from '@kit.AbilityKit'; 55 56export default class EntryAbility extends UIAbility { 57 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { 58 console.info("[Demo] EntryAbility onCreate"); 59 this.context.setRestoreEnabled(true); 60 if (want && want.parameters) { 61 let recoveryMyData = want.parameters["myData"]; 62 } 63 } 64 65 onSaveState(state:AbilityConstant.StateType, wantParams: Record<string, Object>) { 66 // Ability has called to save app data 67 console.log("[Demo] EntryAbility onSaveState"); 68 wantParams["myData"] = "my1234567"; 69 return AbilityConstant.OnSaveResult.ALL_AGREE; 70 } 71} 72```