В данной статье хочется затронуть такую важную тему для Android разработчика, как облачный бэкап данных на примере использования Android Backup Service. Данный сервис позволяет бесплатно хранить данные приложения на удалённом облачном хранилище. Согласно документации он позволяет восстанавливать данные при переустановке приложения, обновлении девайса и при заводском сбросе настроек. Всё, что требуется от пользователя, это то, чтобы у него стояли галочки в «Резервирование данных» и «Автовосстановление» в Настройки/Восстановление и сброс.
Реализация
Перед реализацией необходимо зарегистрировать своё приложение непосредственно в Android Backup Service. Ключ полученный при регистрации используется в манифесте, см. ниже.
Самый простой вариант взаимодействия с BackupManager – это наследование от класса BackupAgentHelper.
В данном классе мы используем два хелпера:
- SharedPreferencesBackupHelper для бэкапа SharedPreferences
- 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);
}
}
Тестирование.
Не забываем внимательно смотреть логи. При указании неверных путей к файлам или префам вы будете проинформированы.
Алгоритм достаточно простой:
- Ввели данные/настройки в приложение.
- Запрашиваем бэкап для приложения adb shell bmgr backup your.package.name.
- Запуск бэкап менеджера adb shell bmgr run.
- Удаляем, ставим заново, PROFIT.
Заключение.
По личным ощущениям и гуглению данный сервис работает стабильно не на всех девайсах, однако внедрение данного функционала почти не требует усилий и поэтому рекомендуется к использованию в приложениях с базой данной или SharedPreferences по умолчанию.
Автор: Andoctorey