1# @ohos.application.BackupExtensionAbility (备份恢复扩展能力)
2
3BackupExtensionAbility模块提供备份恢复服务相关扩展能力,为应用提供扩展的备份恢复能力。
4
5> **说明:**
6>
7> - 本模块首批接口从API version 10开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
8>
9> - 本模块接口仅可在Stage模型下使用。
10
11## 导入模块
12
13```ts
14import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit';
15```
16
17## BundleVersion
18
19恢复时所需要的版本信息,开发者可根据配置的版本号来判断本次恢复时的应用版本数据。
20
21**系统能力**:SystemCapability.FileManagement.StorageService.Backup
22
23| 名称 | 类型   | 必填 | 说明             |
24| ---- | ------ | ---- | ---------------- |
25| code | number | 是   | 应用的版本号。   |
26| name | string | 是   | 应用的版本名称。 |
27
28## BackupExtensionAbility
29
30应用接入数据备份恢复需要通过BackupExtensionAbility实现,开发者可以通过[onBackup](#onbackup),[onRestore](#onrestore)来实现自定义的备份恢复操作。
31
32### 属性
33
34**系统能力**:SystemCapability.FileManagement.StorageService.Backup
35
36| 名称                  | 类型                                                              | 必填 | 说明                                                |
37| --------------------- | ----------------------------------------------------------------- | ---- | --------------------------------------------------- |
38| context<sup>11+</sup> | [BackupExtensionContext](js-apis-file-backupextensioncontext.md) | 是  | BackupExtensionAbility的上下文环境,继承自[ExtensionContext](../apis-ability-kit/js-apis-inner-application-extensionContext.md)。 |
39
40### onBackup
41
42onBackup(): void;
43
44Extension生命周期回调,在执行备份数据时回调,由开发者提供扩展的备份数据的操作。
45
46**系统能力**:SystemCapability.FileManagement.StorageService.Backup
47
48**示例:**
49
50  ```ts
51  class BackupExt extends BackupExtensionAbility {
52    async onBackup() {
53      console.log('onBackup');
54    }
55  }
56  ```
57
58### onBackupEx<sup>12+</sup>
59
60onBackupEx(backupInfo: string): string | Promise&lt;string&gt;
61
62备份恢复框架增加扩展参数,允许应用备份、恢复时传递参数给应用
63onBackupEx与onBackup互斥,如果重写onBackupEx,则优先调用onBackupEx。
64onBackupEx返回值不能为空字符串,若onBackupEx返回值为空字符串,则会尝试调用onBackup。
65
66**系统能力**:SystemCapability.FileManagement.StorageService.Backup
67
68**参数:**
69
70| 参数名           | 类型                            | 必填 | 说明                          |
71|---------------| ------------------------------- | ---- |-----------------------------|
72| backupInfo    |string | 是   | 扩展恢复数据的特殊处理接口中三方应用需要传递的包信息。 |
73
74**说明:**
75>
76> 同步处理业务场景中,推荐使用示例如下。
77
78**示例:**
79
80  ```ts
81  import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit';
82
83  interface ErrorInfo {
84    type: string,
85    errorCode: number,
86    errorInfo: string
87  }
88
89  class BackupExt extends BackupExtensionAbility {
90    onBackupEx(backupInfo: string): string {
91      console.log(`onBackupEx ok`);
92      let errorInfo: ErrorInfo = {
93        type: "ErrorInfo",
94        errorCode: 0,
95        errorInfo: "app customized error info"
96      }
97      return JSON.stringify(errorInfo);
98    }
99  }
100  ```
101
102**说明:**
103>
104> 异步处理业务场景中,推荐使用示例如下。
105
106**示例:**
107
108  ```ts
109  import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit';
110
111  interface ErrorInfo {
112    type: string,
113    errorCode: number,
114    errorInfo: string
115  }
116
117  class BackupExt extends BackupExtensionAbility {
118    //异步实现
119    async onBackupEx(backupInfo: string): Promise<string> {
120      console.log(`onBackupEx ok`);
121      let errorInfo: ErrorInfo = {
122        type: "ErrorInfo",
123        errorCode: 0,
124        errorInfo: "app customized error info"
125      }
126      return JSON.stringify(errorInfo);
127    }
128  }
129  ```
130
131### onRestore
132
133onRestore(bundleVersion: BundleVersion): void;
134
135Extension生命周期回调,在执行恢复数据时回调,由开发者提供扩展的恢复数据的操作。
136
137**系统能力**:SystemCapability.FileManagement.StorageService.Backup
138
139**参数:**
140
141| 参数名        | 类型                            | 必填 | 说明                           |
142| ------------- | ------------------------------- | ---- | ------------------------------ |
143| bundleVersion | [BundleVersion](#bundleversion) | 是   | 恢复时应用数据所在的版本信息。 |
144
145**示例:**
146
147  ```ts
148  import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit';
149
150  class BackupExt extends BackupExtensionAbility {
151    async onRestore(bundleVersion : BundleVersion) {
152      console.log(`onRestore ok ${JSON.stringify(bundleVersion)}`);
153    }
154  }
155  ```
156
157### onRestoreEx<sup>12+</sup>
158
159onRestoreEx(bundleVersion: BundleVersion, restoreInfo: string): string | Promise&lt;string&gt;
160
161Extension生命周期回调,在执行恢复数据时回调,由开发者提供扩展的恢复数据的操作,支持异步操作。
162onRestoreEx与onRestore互斥,如果重写onRestoreEx,则优先调用onRestoreEx。
163onRestoreEx返回值不能为空字符串,若onRestoreEx返回值为空字符串,则会尝试调用onRestore。
164onRestoreEx的返回值为Json格式,使用方法见示例代码。
165
166**系统能力**:SystemCapability.FileManagement.StorageService.Backup
167
168**参数:**
169
170| 参数名        | 类型                            | 必填 | 说明                           |
171| ------------- | ------------------------------- | ---- | ------------------------------ |
172| bundleVersion | [BundleVersion](#bundleversion) | 是   | 恢复时应用数据所在的版本信息。 |
173| restoreInfo |string | 是   | 预留字段,应用恢复过程中需要的扩展参数 |
174
175**说明:**
176>
177> 异步处理业务场景中,推荐使用示例如下。
178
179**示例:**
180
181  ```ts
182  import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit';
183  interface ErrorInfo {
184    type: string,
185    errorCode: number,
186    errorInfo: string
187  }
188
189  class BackupExt extends BackupExtensionAbility {
190    // 异步实现
191    async onRestoreEx(bundleVersion : BundleVersion, restoreInfo: string): Promise<string> {
192      console.log(`onRestoreEx ok ${JSON.stringify(bundleVersion)}`);
193      let errorInfo: ErrorInfo = {
194        type: "ErrorInfo",
195        errorCode: 0,
196        errorInfo: "app customized error info"
197      }
198      return JSON.stringify(errorInfo);
199    }
200  }
201  ```
202
203**说明:**
204>
205> 同步处理业务场景中,推荐使用示例如下。
206
207**示例:**
208
209```ts
210  import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit';
211  interface ErrorInfo {
212    type: string,
213    errorCode: number,
214    errorInfo: string
215  }
216
217  class BackupExt extends BackupExtensionAbility {
218    // 同步实现
219    onRestoreEx(bundleVersion : BundleVersion, restoreInfo: string): string {
220      console.log(`onRestoreEx ok ${JSON.stringify(bundleVersion)}`);
221      let errorInfo: ErrorInfo = {
222        type: "ErrorInfo",
223        errorCode: 0,
224        errorInfo: "app customized error info"
225      }
226      return JSON.stringify(errorInfo);
227    }
228  }
229  ```
230
231### onProcess<sup>12+</sup>
232
233onProcess(): string;
234
235备份恢复框架增加进度返回接口,该接口为同步接口,由应用在执行onBackup(onBackupEx)/onRestore(onRestoreEx)期间进行实现,
236返回应用自身处理业务的进度,返回值为json结构,使用方法见示例代码。
237
238**系统能力**:SystemCapability.FileManagement.StorageService.Backup
239
240> **说明:**
241> (1) onProcess可以不实现,系统有默认处理机制;若要实现,返回值结构严格按照示例代码返回</br>
242> (2) 实现onProcess时,业务需要将onBackup(onBackupEx)/onRestore(onRestoreEx)做异步实现,且需要单
243> 独开辟子线程,否则onProcess相关功能无法正常运行,具体使用方式见示例代码
244>
245> onProcess() 推荐使用示例如下。
246
247**示例:**
248
249  ```ts
250  import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit';
251  import { taskpool } from '@kit.ArkTS';
252
253  interface ProgressInfo {
254    name: string, // appName
255    processed: number, // 已处理的数据 
256    total: number, // 总数
257    isPercentage: boolean // 可选字段,true表示需要按百分比的格式化展示进度,false或者不实现该字段表示按具体项数展示进度
258  }
259
260  class BackupExt extends BackupExtensionAbility {
261    // 如下代码中,appJob方法为模拟的实际业务代码,args为appJob方法的参数,用于提交到taskpool中,开启子线程进行工作
262    async onBackup() {
263      console.log(`onBackup begin`);
264      let args = 100; // args为appJob方法的参数
265      let jobTask: taskpool.Task = new taskpool.LongTask(appJob, args);
266      try {
267        await taskpool.execute(jobTask, taskpool.Priority.LOW);
268      } catch (error) {
269        console.error("onBackup error." + error.message);
270      }
271      taskpool.terminateTask(jobTask); // 需要手动销毁
272      console.log(`onBackup end`);
273    }
274
275    async onRestore() {
276      console.log(`onRestore begin`);
277      let args = 100; // args为appJob方法的参数
278      let jobTask: taskpool.Task = new taskpool.LongTask(appJob, args);
279      try {
280        await taskpool.execute(jobTask, taskpool.Priority.LOW);
281      } catch (error) {
282        console.error("onRestore error." + error.message);
283      }
284      taskpool.terminateTask(jobTask); // 需要手动销毁
285      console.log(`onRestore end`);
286    }
287 
288
289    onProcess(): string {
290      console.log(`onProcess begin`);
291      let process: string = `{
292       "progressInfo":[
293         {
294          "name": "callact", // appName
295          "processed": 100, // 已处理的数据 
296          "total": 1000, //总数
297          "isPercentage", true // 可选字段,true表示需要按百分比的格式化展示进度,false或者不实现该字段表示按具体项数展示进度
298         }
299       ]
300      }`;
301      console.log(`onProcess end`);
302      return JSON.stringify(process);
303    }
304  }
305
306  @Concurrent
307  function appJob(args: number) : string {
308    // 业务实际逻辑
309    console.log(`appJob begin, args is: ` + args);
310    return "ok";
311  }
312  ```
313