Pull to refresh

Реализация облачного бэкапа данных на основе Android Backup Service

Reading time 3 min
Views 16K
В данной статье хочется затронуть такую важную тему для Android разработчика, как облачный бэкап данных на примере использования Android Backup Service. Данный сервис позволяет бесплатно хранить данные приложения на удалённом облачном хранилище. Согласно документации, он позволяет восстанавливать данные при переустановке приложения, обновлении девайса и при заводском сбросе настроек. Всё, что требуется от пользователя, это то, чтобы у него стояли галочки в «Резервирование данных» и «Автовосстановление» в Настройки/Восстановление и сброс.

Реализация


Перед реализацией необходимо зарегистрировать своё приложение непосредственно в Android Backup Service. Ключ полученный при регистрации используется в манифесте, см. ниже.

Самый простой вариант взаимодействия с BackupManager – это наследование от класса BackupAgentHelper.
В данном классе мы используем два хелпера:
  1. SharedPreferencesBackupHelper для бэкапа SharedPreferences
  2. FileBackupHelper для бэкапа файлов из внутреннего хранилища.

public class TheBackupAgent extends BackupAgentHelper {

    @Override
    public void onCreate() {
            // DatabaseHelper.DATABASE_NAME – константа с названием базы данных. 
            FileBackupHelper fileBackupHelper = new FileBackupHelper(this, "../databases/" + DatabaseHelper.DATABASE_NAME);
            addHelper(DatabaseHelper.DATABASE_NAME, fileBackupHelper);
            //здесь мы просто, через запятую указываем названия файлов, в которых хранятся ваши настройки. Обратите внимание на последний параметр, в файле под таким названием хранит данные дефолтный PreferenceManager(PreferenceManager.getDefaultSharedPreferences(context))
            SharedPreferencesBackupHelper helper = new SharedPreferencesBackupHelper(this, SharedPreferenceHelper.PREFERENCES, getPackageName() + "_preferences");
            addHelper("prefs", helper);
     }

     //метод для запроса бэкапа. Согласно документации следует вызывать этот метод всякий раз, когда данные изменились. 
     public static void requestBackup(Context context) {
            BackupManager bm = new BackupManager(context);
            bm.dataChanged();
    }
}


Вы удивитесь, но в принципе это всё. Напоследок просто указываем путь к классу бэкап агента в манифесте и дополнительные атрибуты с говорящим названием. Также в meta-data прописывается ключ, полученный при регистрации приложения.

<application
        android:name=". MyApplication "
        android:allowBackup="true"
        android:restoreAnyVersion="true"
        android:backupAgent=".util.TheBackupAgent"
        <meta-data android:name="com.google.android.backup.api_key"
           android:value="AEdPqrEAAAAIDaYEVgU6DJnyJdBmU7KLH3kszDXLv_4DIsEIyQ" />
</application>


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

public class MyApplication extends Application {
    @Override
    public void onCreate() {
            TheBackupAgent.requestBackup(this);
    }
}


Тестирование.


Не забываем внимательно смотреть логи. При указании неверных путей к файлам или префам вы будете проинформированы.
Алгоритм достаточно простой:
  1. Вводим данные/настройки в приложение.
  2. Запрашиваем бэкап для приложения adb shell bmgr backup your.package.name.
  3. Запускаем бэкап менеджера adb shell bmgr run.
  4. Удаляем, ставим заново, PROFIT.

Заключение.


По личным ощущениям и гуглению данный сервис работает стабильно не на всех девайсах, однако внедрение данного функционала почти не требует усилий и поэтому рекомендуется к использованию в приложениях с базой данных или SharedPreferences по умолчанию.
Tags:
Hubs:
+12
Comments 2
Comments Comments 2

Articles