Использование API резервного копирования

Когда пользователь покупает новое устройство или сбрасывает настройки существующих, они могли бы ожидать, что когда Google Play восстанавливает ваше приложение на их устройстве, то также будут восстановлены связанные с приложением предыдущие данные. По умолчанию, этого не произойдет и все достижения пользователя или настройки в вашем приложении будут потеряны.

В ситуациях, когда объем данных относительно маленький (менее мегабайта), как например предпочтения и настройки пользователя, заметки, таблицы рекордов игры или другая статистика, API резервного копирования обеспечивает простое решение. Этот урок проведет вас через интеграцию API резервного копирования в приложение и восстановления данных на новых устройствах с помощью API резервного копирования.

Регистрация в сервисе резервного копирования Android

Для этого урока необходимо использовать Сервис резервного копирования Android, который требует регистрации. Дальше зарегистрируйтесь здесь. Как только это будет сделано, служба предварительно заполнит XML теги для вставки в ваш манифест, который выглядит следующим образом:

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

Обратите внимание, что каждый ключ резервного копирования работает с определенным именем пакета. Если у вас есть несколько приложений, зарегистрируйте отдельные ключи для каждого из них.

Настройка вашего манифеста

Использование сервиса резервного копирования Android требует два дополнения в манифесте приложения. Во-первых, объявите имя класса, который будет выступать в качестве агента резервного копирования, затем добавьте фрагмент показанный выше как качестве дочернего элемент тега Application. Предполагая, что агентом резервного копирования будет 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() метода, создайте BackupHelper. Эти вспомогательные классы являются специализированными классами для резервного копирования определенного вида данных. Платформа Android в настоящее время включает два таких вспомогательных класса: FileBackupHelper и SharedPreferencesBackupHelper. После создания экземпляра класса укажите ему на данные, для которых вы хотите создать резервную копию, и просто добавьте его в BackupAgentHelper с помощью addHelper() метода, добавив также ключ, который будет использоваться позже для получения данных. В большинстве случаев вся реализация, пожалуй, 10 строк кода.

Вот пример, который создает резервную копию файла рекордов.

 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 конструктор может принимать переменное количество имен файлов. Вы можете так же легко выполнить резервное копирование как файла рекордов так и файла хода игра просто добавив дополнительный параметр, как здесь:

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

Резервное копирование настроек выполняется так же легко. Создайте SharedPreferencesBackupHelper так же, как вы делали с FileBackupHelper. В этом случае, вместо добавления имен файлов в конструктор, добавить имена общих групп настроек, используемых в вашем приложении. Вот пример того, как может выглядеть агент резервного копирования, если таблица рекордов реализована в виде объекта настроек вместо простого файла:

 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 обрабатывает все группы настроек, для которых необходимо резервное копирование.

Запрос резервной копии

Чтобы запросить резервную копию, просто создайте экземпляр BackupManager, и вызовите его dataChanged() метод.

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

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

Этот вызов уведомляет менеджер резервного копирования, что есть данные, готовые для резервного копирования в облако. В какой-то момент в будущем, менеджер резервного копирования затем вызывает у вашего агента резервного копирования onBackup() метод. Вы можете сделать вызов, когда ваши данные изменились, не беспокоясь о чрезмерной сетевой активности. Если вы запрашиваете резервное копирование дважды, прежде чем резервное копирование действительно произойдет, резервное копирование выполнится только один раз.

Восстановление из резервной копии

Как правило, вы не должны когда-либо вручную запрашивать восстановление, так как это происходит автоматически при установке приложения на устройство. Однако, если это является необходимым, то для восстановления вручную просто сделайте вызов requestRestore() метода.