# @ohos.application.BackupExtensionAbility (BackupExtensionAbility)
The **BackupExtensionAbility** module provides extended backup and restore capabilities for applications.
> **NOTE**
>
> - The initial APIs of this module are supported since API version 10. Newly added APIs will be marked with a superscript to indicate their earliest API version.
>
> - The APIs of this module can be used only in the stage model.
## Modules to Import
```ts
import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit';
```
## BundleVersion
Defines the version information required for data restore. You can determine the application data to be restored based on the version information.
**System capability**: SystemCapability.FileManagement.StorageService.Backup
| Name| Type | Mandatory| Description |
| ---- | ------ | ---- | ---------------- |
| code | number | Yes | Internal version number of the application. |
| name | string | Yes | Version name of the application.|
## BackupExtensionAbility
Implements backup and restore for application access data. You can use [onBackup](#onbackup) and [onRestore](#onrestore) to implement custom backup and restore operations.
### Properties
**System capability**: SystemCapability.FileManagement.StorageService.Backup
| Name | Type | Mandatory| Description |
| --------------------- | ----------------------------------------------------------------- | ---- | --------------------------------------------------- |
| context11+ | [BackupExtensionContext](js-apis-file-backupextensioncontext.md) | Yes | Context of the BackupExtensionAbility. This context is inherited from [ExtensionContext](../apis-ability-kit/js-apis-inner-application-extensionContext.md).|
### onBackup
onBackup(): void;
Called when data is being backed up. You need to implement extended data backup operations.
**System capability**: SystemCapability.FileManagement.StorageService.Backup
**Example**
```ts
class BackupExt extends BackupExtensionAbility {
async onBackup() {
console.log('onBackup');
}
}
```
### onBackupEx12+
onBackupEx(backupInfo: string): string | Promise<string>
Called to pass parameters to the application during the application backup or restore process.
**onBackupEx()** and **onBackup()** are mutually exclusive. If **onBackupEx()** needs to be overridden, call **onBackupEx()** preferentially.
The return value of **onBackupEx()** cannot be an empty string. If an empty string is returned, **onRestore** will be called.
**System capability**: SystemCapability.FileManagement.StorageService.Backup
**Parameters**
| Name | Type | Mandatory| Description |
|---------------| ------------------------------- | ---- |-----------------------------|
| backupInfo |string | Yes | Package information to be passed by the third-party application.|
> **NOTE**
>
> The following shows the sample code for synchronous implementation.
**Example**
```ts
import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit';
interface ErrorInfo {
type: string,
errorCode: number,
errorInfo: string
}
class BackupExt extends BackupExtensionAbility {
onBackupEx(backupInfo: string): string {
console.log(`onBackupEx ok`);
let errorInfo: ErrorInfo = {
type: "ErrorInfo",
errorCode: 0,
errorInfo: "app customized error info"
}
return JSON.stringify(errorInfo);
}
}
```
> **NOTE**
>
> The following shows the sample code for asynchronous implementation.
**Example**
```ts
import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit';
interface ErrorInfo {
type: string,
errorCode: number,
errorInfo: string
}
class BackupExt extends BackupExtensionAbility {
// Asynchronous implementation.
async onBackupEx(backupInfo: string): Promise {
console.log(`onBackupEx ok`);
let errorInfo: ErrorInfo = {
type: "ErrorInfo",
errorCode: 0,
errorInfo: "app customized error info"
}
return JSON.stringify(errorInfo);
}
}
```
### onRestore
onRestore(bundleVersion: BundleVersion): void;
Called when data is being restored. You need to implement extended data restore operations.
**System capability**: SystemCapability.FileManagement.StorageService.Backup
**Parameters**
| Name | Type | Mandatory| Description |
| ------------- | ------------------------------- | ---- | ------------------------------ |
| bundleVersion | [BundleVersion](#bundleversion) | Yes | Version information of the application data to be restored.|
**Example**
```ts
import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit';
class BackupExt extends BackupExtensionAbility {
async onRestore(bundleVersion : BundleVersion) {
console.log(`onRestore ok ${JSON.stringify(bundleVersion)}`);
}
}
```
### onRestoreEx12+
onRestoreEx(bundleVersion: BundleVersion, restoreInfo: string): string | Promise<string>
Called when data is being restored. You need to implement the extended data restore operation. Asynchronous implementation is supported.
**onRestoreEx** and **onRestore** are mutually exclusive. Call **onRestoreEx** preferentially if it is overridden.
The return value of **onRestoreEx** cannot be an empty string. If an empty string is returned, the system will attempt to call **onRestore**.
The return value of **onRestoreEx()** is in JSON format. For details, see the sample code.
**System capability**: SystemCapability.FileManagement.StorageService.Backup
**Parameters**
| Name | Type | Mandatory| Description |
| ------------- | ------------------------------- | ---- | ------------------------------ |
| bundleVersion | [BundleVersion](#bundleversion) | Yes | Version information of the application data to be restored.|
| restoreInfo |string | Yes | Parameter to be passed in the restore process. This field is reserved.|
> **NOTE**
>
> The following shows the sample code for asynchronous implementation.
**Example**
```ts
import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit';
interface ErrorInfo {
type: string,
errorCode: number,
errorInfo: string
}
class BackupExt extends BackupExtensionAbility {
// Asynchronous implementation
async onRestoreEx(bundleVersion : BundleVersion, restoreInfo: string): Promise {
console.log(`onRestoreEx ok ${JSON.stringify(bundleVersion)}`);
let errorInfo: ErrorInfo = {
type: "ErrorInfo",
errorCode: 0,
errorInfo: "app customized error info"
}
return JSON.stringify(errorInfo);
}
}
```
> **NOTE**
>
> The following shows the sample code for synchronous implementation.
**Example**
```ts
import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit';
interface ErrorInfo {
type: string,
errorCode: number,
errorInfo: string
}
class BackupExt extends BackupExtensionAbility {
// Synchronous implementation
onRestoreEx(bundleVersion : BundleVersion, restoreInfo: string): string {
console.log(`onRestoreEx ok ${JSON.stringify(bundleVersion)}`);
let errorInfo: ErrorInfo = {
type: "ErrorInfo",
errorCode: 0,
errorInfo: "app customized error info"
}
return JSON.stringify(errorInfo);
}
}
```
### onProcess12+
onProcess(): string;
Called to report the progress information. This callback is executed synchronously and implemented during the execution of **onBackup/onBackupEx** or **onRestore/onRestoreEx**.
This callback returns the service processing progress of the application. The return value is in JSON format. For details, see the sample code.
**System capability**: SystemCapability.FileManagement.StorageService.Backup
> **NOTE**
>
> - The system provides the default processing mechanism if **onProcess** is not implemented. If **onProcess** is used, the return value must strictly comply with that in the sample code.
> - If **onProcess** is used, **onBackup/onBackupEx** and **onRestore/onRestoreEx** must be asynchronously executed in a dedicated thread. Otherwise, **onProcess** cannot run properly. For details, see the sample code.
>
> - The following example shows the recommended use of **onProcess**.
**Example**
```ts
import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit';
import { taskpool } from '@kit.ArkTS';
interface ProgressInfo {
name: string, // appName
processed: number, // Processed data records.
total: number, // Total count.
isPercentage: boolean // (Optional) The value true means to display the progress in percentage; the value false or not implemented means to display the progress by the number of items.
}
class BackupExt extends BackupExtensionAbility {
// In the following code, the appJob method is the simulated service code, and args specifies the parameters of appJob(). This method is used to start a worker thread in the task pool.
async onBackup() {
console.log(`onBackup begin`);
let args = 100; // args is a parameter of appJob().
let jobTask: taskpool.Task = new taskpool.LongTask(appJob, args);
try {
await taskpool.execute(jobTask, taskpool.Priority.LOW);
} catch (error) {
console.error("onBackup error." + error.message);
}
taskpool.terminateTask (jobTask); // Manually destroy the task.
console.log(`onBackup end`);
}
async onRestore() {
console.log(`onRestore begin`);
let args = 100; // args is a parameter of appJob().
let jobTask: taskpool.Task = new taskpool.LongTask(appJob, args);
try {
await taskpool.execute(jobTask, taskpool.Priority.LOW);
} catch (error) {
console.error("onRestore error." + error.message);
}
taskpool.terminateTask (jobTask); // Manually destroy the task.
console.log(`onRestore end`);
}
onProcess(): string {
console.log(`onProcess begin`);
let process: string = `{
"progressInfo":[
{
"name": "callact", // appName
"processed": 100, // Processed data records.
"total": 1000, // Total count.
"isPercentage", true // (Optional) The value true means to display the progress in percentage; the value false or not implemented means to display the progress by the number of items.
}
]
}`;
console.log(`onProcess end`);
return JSON.stringify(process);
}
}
@Concurrent
function appJob(args: number) : string {
// Service logic.
console.log(`appJob begin, args is: ` + args);
return "ok";
}
```