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