22

好的,所以我正在尝试在我的应用程序中实现数据备份,并且一直在遵循本指南。我已经实现了我的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()的 inSudokuBackupAgent从来没有被调用过。或者至少它从未从调试器中得到。似乎没有找到任何更新的数据,我已经仔细检查以确保有数据要备份。我在这里缺少什么吗?

编辑:我应该补充一点,我正在设备(Galaxy Nexus)上进行测试,我什至尝试使用导出的版本 APK 进行测试。

4

3 回答 3

3

1) 将 Log.i() 放入你的 onCreate 中,看看它是否被调用。

2) Logcat 表明你的函数没有写任何东西。检查您的应用程序的私有文件夹中是否有 shared_prefs/SCORES 文件(假设在根设备上使用适当的文件管理器)。这是您尝试备份的文件。可能您的首选项文件不是此文件,在这种情况下,请修复您的字符串分数以反映真实的首选项文件。

3)我尝试在我的应用程序中调试BackupAgentHelper.onCreate,它可以在调用adb shell bmgt后进行调试......所以可以在调试器中单步执行。

于 2012-07-10T06:57:08.673 回答
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 传输,您会更快乐。检查有关此的开发文档。

于 2012-09-26T23:52:01.940 回答
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()
于 2012-07-15T14:01:57.623 回答