BackupManager不能调用备份传输

好的,所以我试图将数据备份实施到我的应用程序中,并一直遵循本指南 。 我已经使用SharedPreferencesBackupHelper实现了我的BackupAgentHelper 。 我没有得到任何错误,我肯定会在所有首选项更改后调用dataChanged() ,但是当我testing备份(`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(); 

我试过debugging,似乎我在SudokuBackupAgent onCreate()永远不会被调用。 或者至less它从来没有从debugging器到达。 它似乎没有find任何更新的数据,我已经双重检查确保有数据要备份。 有什么我在这里失踪?

编辑 :我应该添加,我正在testing设备(Galaxy Nexus),我甚至尝试使用导出的发布APK用于testing目的。

Solutions Collecting From Web of "BackupManager不能调用备份传输"

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

2)Logcat表明你的函数没有写任何东西。 检查您的应用程序的私人文件夹中是否有shared_prefs / SCORES文件(假定在根设备上使用适当的文件pipe理器)。 这是您正在尝试备份的文件。 可能你的喜好文件是这个文件以外的其他东西,在这种情况下修正你的String SCORES来反映真实的喜好文件。

3)我试图在我的应用程序中debuggingBackupAgentHelper.onCreate,并且可以在调用adb shell bmgt之后进行debugging…因此可以在debugging器中进行操作。

我今天和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() 

如果你不改变你的偏好数据,它只会备份一次,但不会随后。

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交通工具。 检查这个开发文档。