Android SharedPreferences Резервное копирование не работает
Я делал домашнее задание о том, как сделать резервную копию SharedPreferences в моем приложении для Android, особенно используя отражение для обеспечения обратной совместимости. По крайней мере, я пытался. К сожалению, ни один из моих кодов фактически не создает резервную копию! Это включает принудительное использование команд adb bmgr на эмуляторе, как описано здесь. Поэтому мне интересно, может ли сообщество помочь мне, и в процессе придумать лучшую документацию?
Вот мой код Чтобы сделать это как можно более универсальным для других, я просто позвоню своему приложению Энди с именем пакетаcom.example.andy.
Android Манифест(выдержка)
<application
...
android:backupAgent="com.example.andy.backupHelper"
android:restoreAnyVersion="true">
...
<meta-data
android:name="com.google.android.backup.api_key"
android:value="GIVEN KEY GOES HERE" />
...
backupHelper.java
Примечание: /data/data/com.example.andy/shared_prefs/com.example.andy_preferences.xml
package com.example.andy;
import android.app.backup.BackupAgentHelper;
import android.app.backup.SharedPreferencesBackupHelper;
public class BlinkyBackup extends BackupAgentHelper {
static final String PREFS_FILE = "andy_preferences";
static final String BACKUP_KEY = "AndyPreferencesBackup";
public void onCreate() {
SharedPreferencesBackupHelper backupHelper = new SharedPreferencesBackupHelper(this, PREFS_FILE);
addHelper(BACKUP_KEY, backupHelper);
}
}
BackupAgentWrapper
package com.example.andy;
import android.app.backup.BackupManager;
import android.content.Context;
public class BackupAgentWrapper {
private BackupManager wrappedInstance;
static {
try {
Class.forName("android.app.backup.BackupManager");
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void checkAvailable() {}
public void dataChanged() {
wrappedInstance.dataChanged();
}
public BackupAgentWrapper(Context ctx) {
wrappedInstance = new BackupManager(ctx);
}
}
И, наконец, команды для запуска резервного копирования во время выполнения. В моем приложении этот код запускается из класса, доступного для моего приложения (не основного действия), который передается в качестве контекста при создании и затем сохраняется в закрытой переменной mContext.
private void backupData() {
boolean backupAgentAvailable = false;
try {
BackupAgentWrapper.checkAvailable();
backupAgentAvailable = true;
}
catch (Throwable t) {
// really nothing to do
}
if(backupAgentAvailable) {
BackupAgentWrapper backupWrapper = new BackupAgentWrapper(mContext);
backupWrapper.dataChanged();
}
}
Подводя итог, ни приведенная выше функция, ни приведенные ниже команды фактически не создают резервных копий данных:
$ adb shell bmgr enable true
$ adb shell bmgr backup com.example.andy
$ adb shell bmgr run
1 ответ
В вашей основной деятельности по вызову (первой, которая начинается в вашем приложении), вам нужно создать экземпляр BackupManager
:
BackupManager mBackupManager = new BackupManager(getApplicationContext());
Это скажет администратору резервного копирования найти файл резервной копии и загрузить его.
Вы должны убедиться, что файл настроек имеет формат "packagename_preferences"
например. andy_preferences. И используйте то же имя, когда вы впервые сохранили свои настройки. (Очень важно!)
После того, как ваши настройки сохранятся через apply()
или же commit()
нужно сказать BackupManager
что-то изменилось, поэтому включите сразу после:
mBackupManger.dataChanged();