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

В данной статье хочется затронуть такую важную тему для 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 по умолчанию.
  • +12
  • 14.6k
  • 2
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 2

    0
    Спасибо за статью. Наконец, решил внедрить подобное в своем приложении.

    В вашей статье вводят в заблуждение/вызывают вопросы следующие моменты:
    • Использование DatabaseHelper — пришлось разбираться (в оригинальной документации) что же это такое, лишь потом заметил, что вы просто используете имя базы данных (видимо, скопировали код из своего проекта) — для простоты можно было бы убрать DatabaseHelper из статьи совсем.
    • SharedPreferenceHelper и SharedPreferenceHelper.PREFERENCES — так и не понял, что это такое.
    • Насколько безопасно использовать значения "../databases/" и "_preferences"? Применимо ли это ко всем версиям Android, не изменится ли в будущих версиях?


    И, самое главное — Android Backup Service поддерживается начиная с Android 2.2. Как его правильно внедрить для приложения с minSdkVersion=7?
      0
      Спасибо за комментарий, отвечу по пунктам:
      1. DatabaseHelper.DATABASE_NAME — название говорящее, пусть лучше останется так, поскольку большинство хранит название базы в хелперах.
      2. Тоже самое, что и с базой, название файла, где хранятся префы
      3. Безопасно и применимо
      4. Никак, а есть ли смысл?)

    Only users with full accounts can post comments. Log in, please.