我一直在研究如何备份SharedPreferences在我的Android应用程序中,特别是使用反射来保持向后兼容性。至少我一直在尝试。不幸的是,我的代码实际上并没有创建备份!这包括强制在模拟器上执行adb bmgr命令,如此这里所述。因此,我想知道社区是否可以帮助我,并在此过程中提供一些更好的文档?
以下是我的代码。为了使其尽可能通用,我将简单地将我的应用程序称为Andy,包名为com.example.andy。 Android清单(摘录)
最后,是在运行时启动备份的命令。在我的应用程序中,这段代码是从一个可用于应用程序的类(而不是主活动)运行的,该类在创建时将 this 作为上下文传递,并存储在私有变量mContext中。
总结一下,以上函数和以下命令都不会备份任何数据:
以下是我的代码。为了使其尽可能通用,我将简单地将我的应用程序称为Andy,包名为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.xmlpackage 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);
}
}
备份代理包装器
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);
}
}
最后,是在运行时启动备份的命令。在我的应用程序中,这段代码是从一个可用于应用程序的类(而不是主活动)运行的,该类在创建时将 this 作为上下文传递,并存储在私有变量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