我根据文档实现了BackupAgentHelper
,包括1.6的向后兼容性,以备份我的所有SharedPreferences
。在模拟器Android 2.2中进行测试时以及在我的设备上运行时,它运行得很好,该设备通过USB运行Android 2.3.3。在这两个测试用例中,我发出:adb shell bmgr run
,它会触发备份。
但是,从Android电子市场重新安装我的应用时,所有SharedPreferences
都已消失。
文档说在调用dataChanged()
之后,“备份管理器随后在适当的时候调用备份代理的onBackup()方法”。很好,但有谁知道是什么让系统实际进行备份?我怀疑在我的情况下没有发生这种情况。
文档说:“如果使用设备,请打开系统设置,选择隐私,然后启用备份我的数据和自动恢复。”但我的设备(SE Xperia Mini)中没有该选项。我只能猜测此选项始终处于启用状态且无法关闭。 我在瑞典使用Telia作为我的运营商(如果这很重要)。
任何人都知道为什么在从市场重新安装时备份无效,但在使用模拟器时通过USB在设备上完全正常工作?
答案 0 :(得分:2)
隐私设置中的备份和还原设置是特定于供应商的。请参阅此代码片段取自Privacy class:
// Vendor specific
if (getPackageManager().resolveContentProvider(GSETTINGS_PROVIDER, 0) == null) {
screen.removePreference(findPreference(BACKUP_CATEGORY));
}
索尼爱立信用其内容替换了条件声明,并且无条件地删除了此偏好。
此代码由 Apache许可证涵盖,因此SE不需要为您提供源代码。如果您住在国内,为此目的进行逆向工程是合法的,我相信(我不是律师)您可以:
从设备中提取设置包:
adb pull /system/app/Settings.apk Settings.apk
使用apktool解码settings.apk:
apktool d -s Settings.apk
在新创建的设置目录中,您将找到classes.dex。要使用Smali对其进行反编译(可以在code.google.com上找到):
baksmali classes.dex -o classes
最后您对 classes / com / android / settings / PrivacySettings.smali
您可以对从Android模拟器中获取的Settings.apk执行相同的操作,并比较这两个文件。
我也有 Xperia mini pro ( SK17i ),而且那个偏好也不存在。
答案 1 :(得分:0)
我之前在使用Market时测试功能的尝试是通过(相对快速的?)序列完成所有操作。我甚至在更改SharedPreferences中的一些参数后重新启动了手机,然后卸载了我的应用程序,认为关闭会触发待处理的备份同步操作。不幸的是,这并未触发与备份服务器的同步,并且SharedPreferences丢失了。
现在向好的和信息丰富的部分。在卸载我的应用程序之前,我更改了一些SharedPreferences并让手机停留了几个小时。下次我从Market安装它时,SharedPreferences从云备份中恢复了!所以解决方案就是让“未来的适当时机”成为现实。我不喜欢这种行为,但可以接受它,因为我意识到每次调用dataChanged()时都无法同步到服务器。
至少现在我们知道即使您的设备上没有“隐私”下的“备份我的数据和自动恢复”选项,它仍然会使用BackupAgent进行备份。它只需要一些(未定义的)时间来完成它。