本文译自:http://developer.android.com/training/cloudsync/backupapi.html
当用户采购一款新的设备或重置他们现有的设备时,他们可能期望Google Play在把应用程序恢复到设备上的过程中,把之前与应用程序关联的数据也恢复到设备上。默认情况下,这种情况不会发生,并且应用程序中的所有的用户操作履历和设置都不会被恢复。
对于那些相对轻量级的数据(少于1Mb),如用户设置、注释、游戏成绩或其他的统计数据,备份API提供了一种轻量级的解决方案。本文讨论如何把备份API集成到你的应用程序中,并使用备份API把数据恢复到一个新的设备上。
注册Android的备份服务
本文需要使用Android的备份服务,它需要注册。注册地址:https://developer.android.com/google/backup/signup.html?hl=zh-CN&csw=1,注册成功之后,该服务会被包装在一个如下所示的XML标签中:
<meta-data android:name="com.google.android.backup.api_key"
android:value="ABcDe1FGHij2KlmN3oPQRs4TUvW5xYZ" />
你需要把这个标签插入到Android的清单文件中。需要注意的是,每个备份键对应一个特定的包名,如果是不同的应用程序,就要注册不同的备份键。
配置清单文件
使用Android的备份服务需要在你的应用程序清单文件中做两件事。第一,要声明用于备份代理的类,然后把上面的XML标签作为<Appliction>标签的子元素添加到清单文件中。假设你的备份代理类是TheBackupAgent,那么清单文件的如下:
<application android:label="MyApp"
android:backupAgent="TheBackupAgent">
...
<meta-data android:name="com.google.android.backup.api_key"
android:value="ABcDe1FGHij2KlmN3oPQRs4TUvW5xYZ" />
...
</application>
编写备份代理
创建备份代理的最容易的方法是继承包装类BackupAgentHelper类,创建这个辅助类过程很简单,只需创建一个与清单文件声明的备份代理的名称相同类(本例中使用TheBackupAgent),并继承BackupAgentHelper,然后重写onCreate()方法。
在onCreate()方法内部,创建一个备份辅助器,备份辅助器是备份某种类型数据的专用类。Android框架当前包含了两种辅助器:FileBackupHelper和SharePreferencesBackupHelper。创建辅助器,并把它指向要备份的数据之后,就要使用andHelper()方法把它添加给BackupAgentHelper类,这个方法还需要一个用于后续获取数据的键名。大多数情况下,整个实现大约需要10行代码,以下是一个备份高分值文件的例子:
import android.app.backup.BackupAgentHelper;
import android.app.backup.FileBackupHelper;
public class TheBackupAgent extends BackupAgentHelper {
// The name of theSharedPreferences file
static final String HIGH_SCORES_FILENAME = "scores";
// A key to uniquelyidentify the set of backup data
static final String FILES_BACKUP_KEY = "myfiles";
// Allocate a helper andadd it to the backup agent
@Override
void onCreate() {
FileBackupHelper helper = new FileBackupHelper(this, HIGH_SCORES_FILENAME);
addHelper(FILES_BACKUP_KEY,helper);
}
}
为了增加灵活性,FileBackupHelper类的构造器可以带有可变数量的文件名。你可以很容易的同时备份高分值文件和游戏进度文件,如:
@Override
void onCreate() {
FileBackupHelper helper = new FileBackupHelper(this, HIGH_SCORES_FILENAME,PROGRESS_FILENAME);
addHelper(FILES_BACKUP_KEY,helper);
}
备份设置也类似的简单。使用与FileBackupHelper相同的方法创建一个SharedPreferencesBackupHelper辅助器。这时要用应用程序所使用的共享设置组来代替构造器中的文件名,示例如下:
import android.app.backup.BackupAgentHelper;
importandroid.app.backup.SharedPreferencesBackupHelper;
public class TheBackupAgent extends BackupAgentHelper {
// The names of theSharedPreferences groups that the application maintains. These
// are the samestrings that are passed to getSharedPreferences(String, int).
static final String PREFS_DISPLAY = "displayprefs";
static final String PREFS_SCORES = "highscores";
// An arbitrarystring used within the BackupAgentHelper implementation to
// identify theSharedPreferencesBackupHelper's data.
static final String MY_PREFS_BACKUP_KEY = "myprefs";
// Simply allocate ahelper and install it
void onCreate() {
SharedPreferencesBackupHelper helper =
new SharedPreferencesBackupHelper(this, PREFS_DISPLAY,PREFS_SCORES);
addHelper(MY_PREFS_BACKUP_KEY, helper);
}
}
在备份代理辅助器中,你可以添加很多备份辅助器的实例,但要记住,每种类型只需一个实例。即一个FileBackupHelper实例可用于处理所有需要备份的文件,一个SharedPreferencesBackupHelper实例可用于处理所有的需要备份的共享设置组。
请求备份
为了请求备份,。只需创建一个BackupManager类的实例,然后调用它的dataChanged()方法。
import android.app.backup.BackupManager;
...
public void requestBackup() {
BackupManager bm = new BackupManager(this);
bm.dataChanged();
}
这个调用通知备份管理器有数据准备备份到云端。在接下来的某个时刻,备份管理器会调用备份代理的onBackup()方法。无论数据在什么时候发生改变,你都可以要求这个调用,而不用担心网络的过度使用。如果在备份发生之前,你申请了两次备份,那么备份只会发生一次。
从备份中恢复数据
通常,你不需要手动的要求恢复处理,当应用程序被安装到一个设备上时,它会自动发生。但是,如果需要手动的触发恢复操作,只需调用requestRestore()方法。