Hon*_*ong 9 android updates preferences
例如,如果添加或删除了一些首选项条目,那么当使用新的首选项结构更新应用程序时,Android如何处理现有的首选项数据?
我很抱歉这个基本问题,但我勤奋的搜索和阅读找不到答案.
共享首选项存储在文件夹中的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.
至于你的问题,有以下几种情况:
您在新版本中添加了首选项.然后将返回指定为第二个参数的默认值.注意:未使用属性android:defaultValue,因此请注意.
String v = (String)mMap.get(key); // not found => v = null
return v != null ? v : defValue; // return defValue
您删除了新版本中的首选项.xml文件和map对象将包含一些冗余数据,但是当用户下次保存首选项时,它将被修复.
您将首选项的键更改为某个未使用的键.然后将返回默认值.与p.1相同的结果.
您删除一个首选项(用钥匙pref1_key等),改变了另一个项目的重点,以便它指的是第一项(从pref2_key到pref1_key).然后第二个首选项将具有第一个项的值.
(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)
| 归档时间: |
|
| 查看次数: |
665 次 |
| 最近记录: |