OpenHarmony实战开发-应用触发数据备份/恢复(仅对系统应用开放)

652 篇文章 5 订阅
647 篇文章 7 订阅

备份恢复是为设备上应用数据、公共数据和系统服务提供的完整的数据备份和恢复解决方案。系统应用开发者可以根据需求,按下述指导开发应用,以触发备份/恢复数据。

  • 获取能力文件:获取当前系统用户内所有应用与备份恢复相关基础信息的能力文件。能力文件在应用备份/恢复数据时不可缺少。
  • 应用备份数据:根据能力文件提供的应用信息,选择需要备份的应用数据并进行备份。
  • 应用恢复数据:根据能力文件提供的应用信息,选择需要恢复的应用数据并进行恢复。

开发说明

在使用备份恢复接口之前,需要:

1.申请应用权限:ohos.permission.BACKUP

2.导入依赖模块:@ohos.file.backup

import backup from '@ohos.file.backup';

获取能力文件

获取当前系统用户内所有应用与备份恢复相关基础信息的能力文件。能力文件在应用备份恢复数据时是不可缺少的,开发者可以根据需要获取能力文件。

该文件包含设备类型、设备版本、应用的基础性信息,如应用名称、应用数据大小、应用版本信息、是否支持备份恢复、是否在恢复时安装应用。

调用backup.getLocalCapabilities()获取能力文件。

import backup from '@ohos.file.backup';
import common from '@ohos.app.ability.common';
import fs from '@ohos.file.fs';
import { BusinessError } from '@ohos.base';

// 获取应用文件路径
let context = getContext(this) as common.UIAbilityContext;
let filesDir = context.filesDir;

async function getLocalCapabilities(): Promise<void> {
 try {
   let fileData = await backup.getLocalCapabilities();
   console.info('getLocalCapabilities success');
   let fpath = filesDir + '/localCapabilities.json';
   fs.copyFileSync(fileData.fd, fpath);
   fs.closeSync(fileData.fd);
 } catch (error) {
   let err: BusinessError = error as BusinessError;
   console.error('getLocalCapabilities failed with err: ' + JSON.stringify(err));
 }
}

返回的能力文件内容示例:
在这里插入图片描述

{
"bundleInfos" :[{
 "allToBackup" : true,
 "extensionName" : "BackupExtensionAbility",
 "name" : "com.example.hiworld",
 "needToInstall" : false,
 "spaceOccupied" : 0,
 "versionCode" : 1000000,
 "versionName" : "1.0.0"
 }],
"deviceType" : "default",
"systemFullName" : "OpenHarmony-4.0.0.0"
}

应用备份数据

开发者可以根据能力文件提供的应用信息,选择需要备份的应用数据。

备份过程中,备份恢复服务会将应用的数据打包成文件,打包后的文件会以打开的文件句柄形式,通过创建实例时所注册的回调onFileReady接口返回。

开发者可以根据需要将文件内容保存到本地。

示例

 import backup from '@ohos.file.backup';
 import common from '@ohos.app.ability.common';
 import fs from '@ohos.file.fs';
 import { BusinessError } from '@ohos.base';

 // 获取沙箱路径
 let context = getContext(this) as common.UIAbilityContext;
 let filesDir = context.filesDir;
 // 创建SessionBackup类的实例用于备份数据
 let g_session: backup.SessionBackup;
 function createSessionBackup(): backup.SessionBackup {
   let generalCallbacks: backup.GeneralCallbacks = {
     // onFileReady为服务回调给应用侧数据完成的通知,建议开发者在该接口内不要进行过多的耗时实现,可以通过异步线程实现file.fd数据的处理
     onFileReady: (err: BusinessError, file: backup.File) => {
       if (err) {
         console.info('onFileReady err: ' + JSON.stringify(err));
       }
       try {
         let bundlePath = filesDir + '/' + file.bundleName;
         if (!fs.accessSync(bundlePath)) {
           fs.mkdirSync(bundlePath);
         }
         // 此处执行copyFileSync会多一次内存拷贝,开发者可以直接使用onFileReady的file.fd来进行数据出来,处理完成后close即可,这样会减少内存消耗
         fs.copyFileSync(file.fd, bundlePath + `/${file.uri}`);
         fs.closeSync(file.fd);
         console.info('onFileReady success');
       } catch (e) {
         console.error('onFileReady failed with err: ' + e);
       }
     },
     onBundleBegin: (err: BusinessError, bundleName: string) => {
       if (err) {
         console.info('onBundleBegin err: ' + JSON.stringify(err));
       } else {
         console.info('onBundleBegin bundleName: ' + bundleName);
       }
     },
     onBundleEnd: (err: BusinessError, bundleName: string) => {
       if (err) {
         console.info('onBundleEnd err: ' + JSON.stringify(err));
       } else {
         console.info('onBundleEnd bundleName: ' + bundleName);
       }
     },
     onAllBundlesEnd: (err: BusinessError) => {
       if (err) {
         console.info('onAllBundlesEnd err: ' + JSON.stringify(err));
       } else {
         console.info('onAllBundlesEnd');
       }
     },
     onBackupServiceDied: () => {
       console.info('onBackupServiceDied');
     },
   }
   let sessionBackup = new backup.SessionBackup(generalCallbacks);
   return sessionBackup;
 }

 async function sessionBackup (): Promise<void> {
   g_session = createSessionBackup();
   // 此处可根据backup.getLocalCapabilities()提供的能力文件,选择需要备份的应用
   // 也可直接根据应用包名称进行备份
   const backupApps: string[] = [
     "com.example.hiworld",
   ]
   await g_session.appendBundles(backupApps);
   console.info('appendBundles success');
 }

应用恢复数据

开发者可以根据能力文件提供的应用信息,选择需要恢复的应用数据。

恢复过程中,备份恢复服务会根据开发者调用getFileHandle的请求内容,将应用待恢复数据的文件句柄,通过创建实例时注册的回调onFileReady接口返回。可以根据返回的uri将应用对应的待恢复数据写入到文件句柄中。写入完成后开发者调用publishFile通知服务写入完成。

待应用所有恢复数据准备就绪后,服务开始恢复应用数据。

示例

 import backup from '@ohos.file.backup';
 import fs from '@ohos.file.fs';
 import { BusinessError } from '@ohos.base';
 // 创建SessionRestore类的实例用于恢复数据
 let g_session: backup.SessionRestore;
 async function publishFile(file: backup.File): Promise<void> {
   let fileMeta: backup.FileMeta = {
     bundleName: file.bundleName,
     uri: file.uri
   }
   await g_session.publishFile(fileMeta);
 }
 function createSessionRestore(): backup.SessionRestore {
   let generalCallbacks: backup.GeneralCallbacks = {
     onFileReady: (err: BusinessError, file: backup.File) => {
       if (err) {
         console.info('onFileReady err: ' + JSON.stringify(err));
       }
       // 此处开发者请根据实际场景待恢复文件存放位置进行调整 bundlePath
       let bundlePath: string = '';
       if (!fs.accessSync(bundlePath)) {
         console.info('onFileReady bundlePath err : ' + bundlePath);
       }
       fs.copyFileSync(bundlePath, file.fd);
       fs.closeSync(file.fd);
       // 恢复数据传输完成后,会通知服务端文件准备就绪
       publishFile(file);
       console.info('onFileReady success');
     },
     onBundleBegin: (err: BusinessError, bundleName: string) => {
       if (err) {
         console.error('onBundleBegin failed with err: ' + JSON.stringify(err));
       }
       console.info('onBundleBegin success');
     },
     onBundleEnd: (err: BusinessError, bundleName: string) => {
       if (err) {
         console.error('onBundleEnd failed with err: ' + JSON.stringify(err));
       }
       console.info('onBundleEnd success');
     },
     onAllBundlesEnd: (err: BusinessError) => {
       if (err) {
         console.error('onAllBundlesEnd failed with err: ' + JSON.stringify(err));
       }
       console.info('onAllBundlesEnd success');
     },
     onBackupServiceDied: () => {
       console.info('service died');
     }
   }
   let sessionRestore = new backup.SessionRestore(generalCallbacks);
   return sessionRestore;
 }

 async function restore01 (): Promise<void> {
   g_session = createSessionRestore();
   const restoreApps: string[] = [
     "com.example.hiworld",
   ]
   // 能力文件的获取方式可以根据开发者实际场景进行调整。此处仅为请求示例
   // 开发者也可以根据能力文件内容的结构示例,自行构造能力文件内容
   let fileData = await backup.getLocalCapabilities();
   await g_session.appendBundles(fileData.fd, restoreApps);
   console.info('appendBundles success');
   // 添加需要恢复的应用成功后,请根据需要恢复的应用名称,调用getFileHandle接口获取待恢复应用数文件的文件句柄
   // 应用待恢复数据文件数请依据实际备份文件个数为准,此处仅为请求示例
   let handle: backup.FileMeta = {
     bundleName: restoreApps[0],
     uri: "manage.json"
   }
   await g_session.getFileHandle(handle);
   handle.uri = "1.tar";
   await g_session.getFileHandle(handle);
   console.info('getFileHandle success');
 }

如果大家还没有掌握鸿蒙,现在想要在最短的时间里吃透它,我这边特意整理了《鸿蒙语法ArkTS、TypeScript、ArkUI、相关教学视频》以及《鸿蒙生态应用开发白皮书V2.0PDF》《鸿蒙开发学习手册》(共计890页)鸿蒙开发资料等…希望对大家有所帮助:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3

鸿蒙语法ArkTS、TypeScript、ArkUI等…视频教程:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3

在这里插入图片描述

OpenHarmony APP开发教程步骤:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3

在这里插入图片描述

鸿蒙生态应用开发白皮书V2.0PDF:https://docs.qq.com/doc/DZVVkRGRUd3pHSnFG

在这里插入图片描述

南北双向高工技能基础:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3

在这里插入图片描述

应用开发中高级就业技术:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3

在这里插入图片描述

全网首发-工业级 南向设备开发就业技术:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3

在这里插入图片描述

《鸿蒙开发学习手册》:

如何快速入门:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3

1.基本概念
2.构建第一个ArkTS应用
3.……

在这里插入图片描述

开发基础知识:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3

1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……

在这里插入图片描述

基于ArkTS 开发:https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

在这里插入图片描述

  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值