好吧,我正在尝试将数据备份实施到我的应用程序中,并且一直关注this guide。我使用BackupAgentHelper
实现了我的SharedPreferencesBackupHelper
。我没有收到任何错误,我确定在所有首选项更改后调用dataChanged()
,但是当我测试备份(`adb shell bmgr run)时,我在LogCat中获取此信息:
07-07 12:29:00.258: V/BackupManagerService(291): Scheduling immediate backup pass
07-07 12:29:00.258: V/BackupManagerService(291): Running a backup pass
07-07 12:29:00.258: V/BackupManagerService(291): clearing pending backups
07-07 12:29:00.258: V/PerformBackupTask(291): Beginning backup of 1 targets
07-07 12:29:00.289: V/BackupServiceBinder(291): doBackup() invoked
07-07 12:29:00.289: D/PerformBackupTask(291): invokeAgentForBackup on @pm@
07-07 12:29:00.297: I/PerformBackupTask(291): no backup data written; not calling transport
所以为了参考,在我的清单中我添加了:
<application
android:allowBackup="true"
android:backupAgent="com.kcoppock.sudoku.SudokuBackupAgent"
以及
<meta-data
android:name="com.google.android.backup.api_key"
android:value="my_key_goes_here" />
和我的BackupAgentHelper实现如下:
public class SudokuBackupAgent extends BackupAgentHelper {
static final String SCORES = "SCORES";
static final String BACKUP_ID = "sudoku_backup";
@Override
public void onCreate() {
SharedPreferencesBackupHelper backupHelper =
new SharedPreferencesBackupHelper(this, SCORES);
addHelper(BACKUP_ID, backupHelper);
}
}
最后,在我的主要活动中,我呼吁进行这样的数据备份:
edit.putString(id + "_values", valueCache.toString());
edit.putString(id + "_hints", hintCache.toString());
edit.commit();
BackupManager backup = new BackupManager(this);
backup.dataChanged();
我尝试过调试,似乎永远不会调用onCreate()
中的SudokuBackupAgent
。或者至少从调试器中找不到它。它似乎没有找到任何更新的数据,我已经仔细检查确保有备份的数据。这里有什么我想念的吗?
编辑:我应该补充一下,我正在测试一台设备(Galaxy Nexus),我甚至尝试使用导出版本APK进行测试。
答案 0 :(得分:3)
1)将Log.i()放入你的onCreate,看它是否被调用。
2)Logcat表示你的函数没有写任何东西。检查应用程序的私有文件夹中是否有shared_prefs / SCORES文件(假设在root设备上使用适当的文件管理器)。这是您尝试备份的文件。 可能你的首选项文件不是这个文件,在这种情况下修复你的String SCORES以反映真正的首选项文件。
3)我尝试在我的应用程序中调试BackupAgentHelper.onCreate,并且可以在调用adb shell bmgt之后对其进行调试...因此可以在调试器中执行此步骤。
答案 1 :(得分:2)
我今天遇到了与Android SDK 4.1相同的问题。然而,使用2.3.3版本有助于:
07-15 13:59:56.459: V/LocalTransport(61): performBackup() pkg=com........
07-15 13:59:56.469: V/LocalTransport(61): Got change set key=filehelper:../databases/database.db size=8208 key64=ZmlsZWhlbHBlcjouLi8kYXRhYmFzZXMvZXhwZW5zZXIuZGI=
07-15 13:59:56.469: V/LocalTransport(61): data size 8208
07-15 13:59:56.469: V/LocalTransport(61): finishBackup()
答案 2 :(得分:2)
如果您不更改您的偏好数据,它将只备份一次,但不会随后备份。
https://developer.android.com/reference/android/app/backup/SharedPreferencesBackupHelper.html
“每当执行备份时,它将备份自上次备份操作以来已更改的所有已命名共享首选项。”
正如其他海报所说,请确保在你的onCreate中有一个日志声明。
您可以通过以下方式强制备份:
// bmgr wipe TRANSPORT PACKAGE
bmgr wipe com.google.android.backup/.BackupTransportService com.kcoppock.sudoku
bmgr run
默认值为com.google.android.backup/.BackupTransportService
,但最好使用bmgr list transports
检查自己。
对于本地传输而不是默认的Google传输,你会更开心。检查关于此的开发文档。