胡凯

Android Training - 云同步(Lesson 2 - 使用Backup API)

| Comments

Using the Backup API[使用Backup API]

当一个用户购买了新的设备或者是把当前的设备做了的恢复出厂设置的操作,用户希望在进行初始化设置的时候,Google Play能够把之前安装过的应用恢复到设备上。默认情况是,那些操作不会发生,用户之前的设置与数据都会丢失.

对于一些数据量相对较少的情况下(通常少于1MB),例如用户偏好设置,笔记,游戏分数或者是其他的一些状态数据,可以使用Backup API来提供一个轻量级的解决方案。这一课会介绍如何使用Backup API.

(1)Register for the Android Backup Service[为Android备份服务进行注册]

这一课会使用Android Backup Service, 它需要进行注册. 点击这个链接进行注册:register here. 注册成功后,服务器会提供一段类似下面的代码用来添加到程序的Manifest文件中:

1
2
<meta-data android:name="com.google.android.backup.api_key"
android:value="ABcDe1FGHij2KlmN3oPQRs4TUvW5xYZ" />

请注意,每一个备份key都只能在特定的包名下工作,如果你有不同的程序需要使用这个方法进行备份,那么需要为他们分别进行注册。

(2)Configure Your Manifest[确认你的Manifest]

使用Android的备份服务需要添加2个内容到你的程序Manifest中,首先,声明作为你的备份代理的类名,然后添加一段类似上面的代码作为Application标签的根标签。假设你的备份代理是TheBackupAgent, 下面演示里如何在Manifest中添加上面这些信息:

1
2
3
4
5
6
7
<application android:label="MyApp"
             android:backupAgent="TheBackupAgent">
    ...
    <meta-data android:name="com.google.android.backup.api_key"
    android:value="ABcDe1FGHij2KlmN3oPQRs4TUvW5xYZ" />
    ...
</application>

(3)Write Your Backup Agent[编写你的备份代理]

最简单的创建你的备份代理的方法是继承BackupAgentHelper. 创建这个帮助类实际上是非常简单。仅仅是创建一个你上面Manifest文件中声明的类去继承BackupAgentHelper.然后重写onCreate(). 在onCreate() 创建一个BackupHelper. 目前Android framework包含了两种那样的帮助类: FileBackupHelperSharedPreferencesBackupHelper. 在你创建一个帮助类并且指向需要备份的数据的时候,仅仅需要使用 addHelper() 方法来添加到BackupAgentHelper, 在后面再增加一个key用来retrieve数据. 大多数情况下,完整的实现差不多只需要10行代码.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import android.app.backup.BackupAgentHelper;
import android.app.backup.FileBackupHelper;

public class TheBackupAgent extends BackupAgentHelper {
    // The name of the SharedPreferences file  
    static final String HIGH_SCORES_FILENAME = "scores";

    // A key to uniquely identify the set of backup data  
    static final String FILES_BACKUP_KEY = "myfiles";

    // Allocate a helper and add it to the backup agent  
    @Override
    void onCreate() {
        FileBackupHelper helper = new FileBackupHelper(this, HIGH_SCORES_FILENAME);
        addHelper(FILES_BACKUP_KEY, helper);
    }
}

为了使得程序更加灵活,FileBackupHelper的constructor可以带有一些文件名,你可以简单的通过增加一个额外的参数实现备份最高分文件与游戏程序文件,像下面一样:

1
2
3
4
5
@Override
void onCreate() {
  FileBackupHelper helper = new FileBackupHelper(this, HIGH_SCORES_FILENAME, PROGRESS_FILENAME);
  addHelper(FILES_BACKUP_KEY, helper);
}

备份用户偏好同样比较简单. 像创建FileBackupHelper一样来创建一个SharedPreferencesBackupHelper。在这种情况下, 不是添加文件名到constructor,而是添加被你的程序所用的shared preference groups的名称.请看示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import android.app.backup.BackupAgentHelper;
import android.app.backup.SharedPreferencesBackupHelper;

public class TheBackupAgent extends BackupAgentHelper {
    // The names of the SharedPreferences groups that the application maintains.  These  
    // are the same strings that are passed to getSharedPreferences(String, int).  
    static final String PREFS_DISPLAY = "displayprefs";
    static final String PREFS_SCORES = "highscores";


    // An arbitrary string used within the BackupAgentHelper implementation to  
    // identify the SharedPreferencesBackupHelper's data.  
    static final String MY_PREFS_BACKUP_KEY = "myprefs";


    // Simply allocate a helper and install it  
    void onCreate() {
        SharedPreferencesBackupHelper helper =
                new SharedPreferencesBackupHelper(this, PREFS_DISPLAY, PREFS_SCORES);
        addHelper(MY_PREFS_BACKUP_KEY, helper);
    }
}

你可以根据你的喜好增加许多备份帮助类, 但是请记住你仅仅需要为每一类添加一个既可。一个FileBackupHelper 处理了所有的你想要备份的文件, 一个SharedPreferencesBackupHelper 则处理了所有的你想要备份的shared preference groups.

(4)Request a Backup[请求一个备份]

为了请求一个备份,仅仅需要创建一个BackupManager的实例,然后调用它的dataChanged() 方法既可。

1
2
3
4
5
6
7
import android.app.backup.BackupManager;
 ...

public void requestBackup() {
   BackupManager bm = new BackupManager(this);
   bm.dataChanged();
}

执行这个调用通知了backup manager 即将有数据会被备份到云端。在之后的某个时间点,backup manager会执行备份代理的 onBackup() 方法。无论任何时候,只要你的数据有发生改变的都可以去调用它,不用担心会导致过度的网络活动。如果你在上一个备份还没有发生之前再次请求了备份,那么这个备份操作仅仅会出现一次。

(5)Restore from a Backup[从备份中恢复]

通常是,你不应该手动去请求一个恢复,而是应该在你的程序安装到设备上的时候自动进行恢复。然而,如果那确实有必要手动去触发恢复,只需要调 requestRestore() 方法.


学习自:http://developer.android.com/training/cloudsync/backupapi.html,请多指教,谢谢!
转载请注明出自http://kesenhoo.github.com,谢谢配合!

Comments