Android的backup服务允许把持久化的应用程序数据拷贝到远程的“云”存储,以便给应用程序的数据和设置提供一个还原点。如果用户执行了恢复出厂设置或者把应用转换到一个新的Android设备上,系统就会在应用程序被重新安装时,自动的恢复备份的数据。这样用户就不需要在重新复制之前的数据或设置。这个过程对用户来说是完全透明的,并且不会影响到应用程序中功能或用户体验。
在备份操作期间,Android的备份管理器(BackupManager对象)会查询应用程序要备份的数据,然后会把查询到的数据交给一个备份传输器,让它把数据发送给云端的存储器。在恢复操作期间,备份管理器从备份传输器中获取备份数据,并把它返回给应用程序,以便应用程序能够把数据恢复给设备。由应用程序来要求数据恢复操作是可能的,但这不是必须的,因为在应用程序被按照并有跟这个用户相关联的备份数据存在时,Android会自动的执行一个恢复操作。恢复备份数据的主要场景是在用户重置了设备设置,或者升级到了一个新设备,并重新安装了之前安装的应用程序的时候。
注意:备份服务不是为同步应用的数据而设计的,因此不能按需求读写备份数据,并且也不能通过备份管理器提供的API以外的方法来访问备份数据。
备份传输器是Android备份框架的一个客户端组件,它可以由设备制造商或服务提供者来定制。备份传输器可能会因设备而有所不同,并且任何设备上的备份传输器对应用程序是透明的。备份管理器的API把应用程序与给定设备上的实际备份传输器进行了隔离,也就是说应用程序通过一组固定的API与备份管理器进行通信,而不管底层的数据传输。
数据备份组件并不保证在所有的Android设备上都是可用的。然而,即使一个设备没有提供备份传输器,那么应用也不会受到不利的影响。如果确定用户会从应用程序的数据备份中获益,那么可以根据本文档的描述来实现它,然后发布与实际由哪些设备来执行备份操作无关的应用程序。这样应用程序在没有提供备份传输功能的设备上运行时,应用程序也能正常操作,但不接受来自备份管理器的备份数据的回调。
备份数据不能被设备上的其他应用程序所读取,只有备份管理器和备份传输器在备份操作期间能够访问要备份的数据。
警告:因为云端存储与传输服务会因设备而有所差异,Android并不保证备份数据的安全行,因此在备份敏感数据时要始终保持警惕,如用户名和口令数据。
基础
如果要备份应用程序数据,就要实现一个备份代理。备份管理器调用备份代理来提供要备份的数据。应用程序重新安装时,也会调用这个代理来恢复数据。备份管理器会处理所有与云端存储有关的数据事务(使用备份传输器来处理),数据备份代理会处理所有的与本地设备相关的数据事务。
以下是实现备份代理的必须步骤:
1. 在清单文件中用android:backupAgent属性来声明备份代理;
2. 给应用程序注册备份服务,Google提供了Android Backup Service(https://developers.google.com/android/backup/?hl=zh-CN)来作为大多数的Android设备的备份服务。为了让这个服务工作,它要求把应用程序注册到这个服务中。为了把数据保存到服务器上,可能还要注册一些其他的可用的备份服务。
3. 通过以下方式之一来定义备份代理:
A. 继承BackupAgent类
backupAgent类提供了应用程序跟备份管理通信的核心接口。如果直接继承这个类,必须重写onBackup()和onRestore()方法,以便处理 备份和恢复数据的操作。
B. 继承BackupAgentHelper类
BackupAgentHelper类围绕BackupAgent类提供了方便的封装,它只需要编写很少的代码。在BackupAgentHelper的扩展类中,必须使用一个或多个helper对象,它能够自动的备份和恢复某种类型的数据,因此不需要自己来实现onBackup()和onRestore()方法。
Android当前提供了备份和恢复SharedPreferences和内部存储文件的备份helper。