Android使用備份API

2018-08-02 17:43 更新

編寫:kesenhoo - 原文:http://developer.android.com/training/cloudsync/backupapi.html

當(dāng)用戶購買了一臺新的設(shè)備或者是對當(dāng)前的設(shè)備做了恢復(fù)出廠設(shè)置的操作,用戶會希望在進(jìn)行初始化設(shè)置的時候,Google Play 能夠把之前安裝過的應(yīng)用恢復(fù)到設(shè)備上。默認(rèn)情況是,用戶的這些期望并不會發(fā)生,他們之前的設(shè)置與數(shù)據(jù)都會丟失。

對于一些數(shù)據(jù)量相對較少的情況(通常少于1MB),例如用戶偏好設(shè)置、筆記、游戲分?jǐn)?shù)或者是其他的一些狀態(tài)數(shù)據(jù),可以使用 Backup API 來提供一個輕量級的解決方案。這節(jié)課會介紹如何將 Backup API 集成到我們的應(yīng)用當(dāng)中,以及如何利用 Backup API 將數(shù)據(jù)恢復(fù)到新的設(shè)備上。

注冊 Android Backup Service

這節(jié)課中所使用的 Android Backup Service 需要進(jìn)行注冊。我們可以點擊這里進(jìn)行注冊。注冊成功后,服務(wù)器會提供一段類似于下面的代碼,我們需要將它添加到應(yīng)用的 Manifest 文件中:

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

請注意,每一個備份 Key 都只能在特定的包名下工作。如果我們有不同的應(yīng)用需要使用這個方法進(jìn)行備份,那么需要分別為他們進(jìn)行注冊。

配置 Manifest 文件

使用 Android 的備份服務(wù)需要將兩個額外的內(nèi)容添加到應(yīng)用的 Manifest 文件中。首先,聲明備份代理的類名,然后添加一段類似上面的代碼作為 Application 標(biāo)簽的子標(biāo)簽。假設(shè)我們的備份代理叫作 TheBackupAgent,下面的例子展示了如何在 Manifest 文件中添加這些信息:

<application android:label="MyApp"
             android:backupAgent="TheBackupAgent">
    ...
    <meta-data android:name="com.google.android.backup.api_key"
    android:value="ABcDe1FGHij2KlmN3oPQRs4TUvW5xYZ" />
    ...
</application>

編寫備份代理

創(chuàng)建備份代理最簡單的方法是繼承 BackupAgentHelper。 創(chuàng)建這個幫助類實際上非常簡便。首先創(chuàng)建一個類,其類名和上述 Manifest 文件中聲明的類名一致(本例中,它叫做 TheBackupAgent),然后繼承 BackupAgentHelper,之后重寫 onCreate() 方法。

在 onCreate() 中創(chuàng)建一個 BackupHelper。這些幫助類是專門用來備份某些數(shù)據(jù)的。目前 Android Framework 包含了兩種幫助類:FileBackupHelper 與 SharedPreferencesBackupHelper。在我們創(chuàng)建一個幫助類并且指向需要備份的數(shù)據(jù)的時候,僅僅需要使用 addHelper() 方法將它們添加到 BackupAgentHelper 當(dāng)中, 之后再增加一個 Key 用來恢復(fù)數(shù)據(jù)。大多數(shù)情況下,完整的實現(xiàn)差不多只需要10行左右的代碼。

下面是一個對高分?jǐn)?shù)據(jù)進(jìn)行備份的例子:

 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 的構(gòu)造函數(shù)可以帶有任意數(shù)量的文件名。我們只需簡單地通過增加一個額外的參數(shù),就能實現(xiàn)同時對最高分文件與游戲進(jìn)度文件進(jìn)行備份,如下所述:

    @Override
    void onCreate() {
        FileBackupHelper helper = new FileBackupHelper(this, HIGH_SCORES_FILENAME, PROGRESS_FILENAME);
        addHelper(FILES_BACKUP_KEY, helper);
    }

備份用戶偏好同樣比較簡單。和創(chuàng)建 FileBackupHelper 一樣來創(chuàng)建一個 SharedPreferencesBackupHelper。在這種情況下, 不是添加文件名到構(gòu)造函數(shù)當(dāng)中,而是添加被應(yīng)用所使用的 Shared Preference Groups 的名稱。下面的例子展示的是,如果高分?jǐn)?shù)據(jù)是以 Preference 的形式而非文件的形式存儲的,備份代理幫助類應(yīng)該如何設(shè)計:

 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);
     }
 }

雖然我們可以根據(jù)喜好增加任意數(shù)量的備份幫助類到備份代理幫助類中,但是請記住每一種類型的備份幫助類只需要一個就夠了。一個 FileBackupHelper 可以處理所有我們想要備份的文件, 而一個 SharedPreferencesBackupHelper 則能夠處理所有我們想要備份的 Shared Preference Groups。

請求備份

為了請求一個備份,僅僅需要創(chuàng)建一個 BackupManager 實例,然后調(diào)用它的 dataChanged() 方法即可:

 import android.app.backup.BackupManager;
 ...

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

該調(diào)用會告知備份管理器即將有數(shù)據(jù)會被備份到云端。在之后的某個時間點,備份管理器會執(zhí)行備份代理的 onBackup() 方法。無論任何時候,只要數(shù)據(jù)發(fā)生了改變,我們都可以去調(diào)用它,并且不用擔(dān)心這樣會增加網(wǎng)絡(luò)的負(fù)荷。如果我們在備份正式發(fā)生之前請求了兩次備份,那么最終備份操作僅僅會出現(xiàn)一次。

恢復(fù)備份數(shù)據(jù)

一般而言,我們不應(yīng)該手動去請求恢復(fù),而是應(yīng)該讓應(yīng)用安裝到設(shè)備上的時候自動進(jìn)行恢復(fù)。然而,如果確實有必要手動去觸發(fā)恢復(fù),只需要調(diào)用 requestRestore() 方法就可以了。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號