1

我已经BackupAgentHelper根据文档实现了,包括向后兼容 1.6,以备份我所有的SharedPreferences. 在模拟器 Android 2.2 中测试它以及在我的设备上运行时,它运行得很好,该设备通过 USB 运行库存的 Android 2.3.3。在这两个测试用例中,我都会发出:adb shell bmgr run,它会触发备份。

但是,当从 Android Market 重新安装我的应用程序时,一切SharedPreferences都消失了。文档说,dataChanged()在调用之后,“备份管理器然后在未来的适当时间调用你的备份代理的 onBackup() 方法”。很好,但有谁知道是什么让系统实际进行备份?我怀疑这在我的情况下没有发生。

文档说:“如果使用设备,请打开系统设置,选择隐私,然后启用备份我的数据和自动恢复。” 但我的设备(SE Xperia Mini)中不存在该选项。我只能猜测这个选项总是启用的,不能关闭。我在瑞典使用 Telia 作为我的接线员(如果重要的话)。

任何人都知道为什么从 Market 重新安装时备份不起作用,但在使用模拟器和通过 USB 在设备上时完全正常工作?

4

2 回答 2

2

隐私设置中的备份和恢复设置是特定于供应商的。请参阅取自Privacy 类的代码片段:

    // Vendor specific
    if (getPackageManager().resolveContentProvider(GSETTINGS_PROVIDER, 0) == null) {
        screen.removePreference(findPreference(BACKUP_CATEGORY));
    }

索尼爱立信用其内容替换了条件语句,并无条件地删除了此 Preference。

此代码包含在Apache License中,因此 SE 不需要向您提供源代码。如果您居住在国家/地区,我相信出于此目的的逆向工程是合法的(我不是律师),您可以:

  1. 从您的设备中提取设置包:

    adb pull /system/app/Settings.apk Settings.apk
    
  2. 使用apktool解码 settings.apk :

    apktool d -s Settings.apk
    
  3. 在新创建的Settings目录中,您会找到 classes.dex。使用 Smali 反编译它(可以在 code.google.com 上找到):

    baksmali classes.dex -o classes
    
  4. 最后你对classes/com/android/settings/PrivacySettings.smali感兴趣

您可以对从 Android Emulator 获取的 Settings.apk 执行相同操作并比较这两个文件。

我也有Xperia mini pro ( SK17i ),但也不存在这种偏好。

于 2011-10-14T05:15:52.707 回答
0

我之前在使用 Market 时测试功能的尝试是按(相对快速?)顺序进行。我什至在更改 SharedPreferences 中的一些参数后重新启动了手机,然后卸载了我的应用程序,认为关机会触发挂起的备份同步操作。不幸的是,这并没有触发与备份服务器的同步,并且 SharedPreferences 丢失了。

现在到好的和信息丰富的部分。在卸载我的应用程序之前,我更改了一些 SharedPreferences 并让手机运行了几个小时。下次我从 Market 安装它时,SharedPreferences 已从云备份中恢复!所以解决方案就是让“未来的合适时机”成为现实。我不喜欢这种行为,但可以接受它,因为我意识到每次调用 dataChanged() 时它都无法同步到服务器。

至少现在我们知道,即使您的设备上没有“隐私”下的“备份我的数据并自动恢复”选项,它仍然会使用 BackupAgent 进行备份。它只需要一些(未定义的)时间来完成它。

于 2011-08-31T12:04:54.320 回答