当新版本中的首选项结构发生变化时,Android用户首选项的现有数据会发生什么变化?

Hon*_*ong 9 android updates preferences

例如,如果添加或删除了一些首选项条目,那么当使用新的首选项结构更新应用程序时,Android如何处理现有的首选项数据?

我很抱歉这个基本问题,但我勤奋的搜索和阅读找不到答案.

vor*_*olf 6

共享首选项存储在文件夹中的xml文件中data/data/your.application.package/shared_prefs/.该文件被调用your.application.package_preferences.xml;

检索共享首选项时,可以调用Context.getSharedPreferences方法.它创建SharedReferences对象并调用SharedReferences.startLoadFromDisk方法.

如果打开此方法,您将看到mFile解析了带有preferences()的xml文件,并将首选项加载到内存存储(map)中.

BufferedInputStream str = new BufferedInputStream(new FileInputStream(mFile), 16*1024);
map = XmlUtils.readMapXml(str);
Run Code Online (Sandbox Code Playgroud)

从那时起,您将始终从记忆中读取您的偏好.更准确地说来自private Map<String, Object> mMap变量.此外,应用程序可以调用startReloadIfChangedUnexpectedly方法,如果底层文件已更改,则将对其进行解析并创建新的HashMap.

至于你的问题,有以下几种情况:

  1. 您在新版本中添加了首选项.然后将返回指定为第二个参数的默认值.注意:未使用属性android:defaultValue,因此请注意.

    String v = (String)mMap.get(key); // not found => v = null

    return v != null ? v : defValue; // return defValue

  2. 您删除了新版本中的首选项.xml文件和map对象将包含一些冗余数据,但是当用户下次保存首选项时,它将被修复.

  3. 您将首选项的键更改为某个未使用的键.然后将返回默认值.与p.1相同的结果.

  4. 您删除一个首选项(用钥匙pref1_key等),改变了另一个项目的重点,以便它指的是第一项(从pref2_keypref1_key).然后第二个首选项将具有第一个项的值.

  5. 您更改了首选项的类型(例如,从布尔值更改为int).然后它将抛出CastException,因为这和类似的代码:(Integer)mMap.get(key);.但是,您可以将EditTextPreference更改为ListPreference,因为它们都具有String类型.

也许还有一些测试案例,但到目前为止,我只有5个.

以下是带有ListPreference,EditTextPreference和CheckBoxPreference的首选项文件的示例:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="pref_theme_key">THEME_LIGHT</string>
    <string name="pref_homepage_key">test</string>
    <boolean name="pref_display_name_key" value="true" />
</map>
Run Code Online (Sandbox Code Playgroud)

  • @Hong有时官方文档中没有信息,这就是我使用grepcode网站并自己检查源代码的原因. (2认同)