备份管理器未调用备份传输

22

嗯,我正在尝试将数据备份功能集成到我的应用程序中,并遵循此指南。我使用SharedPreferencesBackupHelper实现了我的BackupAgentHelper。我没有收到任何错误提示,并确保在所有首选项更改后调用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();

我已经尝试过调试,似乎我的中的从未被调用。或者至少在调试器中没有到达这个方法。它似乎没有找到任何更新的数据,我已经反复检查以确保有数据可以备份。这里是我错过了什么吗?

编辑:我应该补充说,我是在一个设备上进行测试(Galaxy Nexus),甚至尝试使用导出的发布APK进行测试。


1
@coolcool1994 从来没有什么好运气,我已经放弃尝试了。 - Kevin Coppock
1
我即将停止备份工作。我已经连续工作了5天。我阅读了关于备份的每一篇Stack Overflow文章和许多博客。让我坚持尝试的原因是在某个时候备份确实起作用了。但我可能也不得不放弃。此外,我可以说Android对开发人员来说很糟糕。伟大的应用程序都是在iOS上创建的。 - coolcool1994
@coolcool1994 最终有什么运气吗? - StuStirling
1
没有解决这个问题的方法。我放弃了,你也应该放弃。从2015年1月17日开始,你无法使用备份管理器备份文件。系统不一致,并且随着操作次数增加,备份会失败。 - coolcool1994
1
有人找到答案了吗? - abh22ishek
显示剩余6条评论
3个回答

3

1) 在onCreate()方法中加入Log.i()语句,以便查看是否被调用。

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

3) 我尝试在我的应用程序中调试BackupAgentHelper.onCreate()方法,并且在调用adb shell bmgt...之后可以在调试器中单步执行。


谢谢,我回家后会尝试这些建议。SCORES文件看起来应该是正确的,因为我经常使用getSharedPreferences()访问它。 - Kevin Coppock
这让我很困惑。所以根据#1,我已经记录了onCreate(),并且确实到达了那里。#2,我已经检查过,SCORES.xml确实在shared_prefs/文件夹中,并且包含值。 - Kevin Coppock

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传输,这样你会更加满意。请查看开发文档了解更多信息。

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()

1
你的意思是将目标SDK更改为2.3.3吗?还是回退到旧版本的SDK工具? - Kevin Coppock
1
另外,我刚意识到你的备份是在本地传输中进行的,而不是在Android云备份传输中进行的。 - Kevin Coppock
1
我将执行AVD更改为2.3.3。目标仍然是API-16。我不确定Galaxy Nexus如何处理备份传输。我猜你已经在手机上设置了“备份和重置”功能。但是,无论是本地还是云端,这都不重要。毕竟 - 这是设备特定的(正如Google在DataBackup文档中所述),重要的是使备份/恢复通过,而不管执行方法如何 - 这意味着配置备份代理以及在正确位置放置dataChanged()调用(这对我来说是更难的部分)。 - Kamen
嗨,kcoppock,你确认这是Jelly Bean中的一个错误吗?我正在尝试SDK中的BackupRestore示例,它在JB上不起作用,但在GB和ICS上运行良好。我在所有测试中都使用模拟器。你是否让backupagent在JB上工作了?有什么解决方法吗?谢谢! - Safecoder
1
对我们来说,JB版本中似乎存在一个错误。但在ICS和之前的版本中工作正常。 - Snicolas
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接