Android - 拥有多个共享首选项是不好的做法吗?

时间:2014-02-18 08:21:37

标签: java android sharedpreferences

我有一个使用SharedPreferences的应用。一个只是存储应用程序版本以检查更新日志的更新,另一个包含一些布局信息clear()在用户选择时被调用。我终于设法得到一个PreferenceFragment工作并注意到一个趋势,所以我想我可能会在我偏爱疯狂之前问这个(尽管我认为我已经足够了)。

我尽力搜索并没有特别提到问题,只是可能有多个。

我有点担心PreferenceManager.getDefaultSharedPreferences()抓错了pref,但我可能只是误解了用法。

我可以从我的活动中想到的唯一相关代码:

SharedPreferences storedVer = getSharedPreferences(VER_NUM, 0);
SharedPreferences savedLayout = getSharedPreferences(LAYOUT_SAVE, 0);

3 个答案:

答案 0 :(得分:14)

这一点都不错。我认为情况正好相反。我认为不同的行为应该使用不同的sharedPreference文件。

.getDefaultSharedPreferences()使用默认的com.company.packagename.xml文件。其他人创建自己的文件。

在我的脑海中出现了使用多个sharedPreference's的以下优点。

  • 使用BackupManager时,可以提供要备份和还原的sharedPreference个文件。
  • 当用户注销时,您可以删除其中包含该用户私有值的sharedPreference文件。您可能不想删除其他一些。

答案 1 :(得分:5)

根据我对SharedPreferences的经验,我注意到以下内容:

1)始终使用try尝试使您的SharedPreference名称和属性名称在整个设备上都是唯一的。

2)请勿使用SharedPreference的名称,例如“myPreference”,“preference”,“appPreference”等。使用PackageName作为SharedPreference名称的唯一标识符。

示例:

SharedPreferences preferences = getSharedPreferences(Context.getPackageName(), Context.MODE_PRIVATE);   

3)通过将属性名称与包名称连接,也可以为属性使用唯一的键。

示例:

Editor editor = sharedpreferences.edit();
boolean isAdminKey = Context.getPackageName()+"admin";
editor.putString(isAdminKey , "value");
editor.commit();

4)使用一个commit()编辑多个Keys值没问题。

5)在创建偏好设置时使用MODE_PRIVATE,以防止其他应用程序读取您的SharedPreferences。例如,参见步骤2

6)不要依赖SharedPreferences 100%,因为如果用户从应用信息屏幕按下Clear Data按钮,它将被清除。否则,在ExternalDirectory()中创建文件或将您的信息发送到服务器。

答案 2 :(得分:0)

晚会但我会说不使用多个偏好。坚持getDefaultSharedPreferences。我看到很多人都无法跟踪保存的首选项的名称。通常,它会以错误的方式使代码更复杂(编译器无法帮助您管理您的名称)。此外,共享首选项适用于少数几个小值 - 使用Filesystem来处理大事,使用数据库来处理大量数据。

我已经看到使用了很多命名的共享首选项,我相信这是copyPaste()传播的一个不幸的趋势。

最后,您的偏好活动会写入默认的共享首选项 - 我最近回答了一个问题,即如果使用默认首选项,则会完全避免这个问题。请参阅:Android SharedPreferences not changing

您可以考虑包装默认的共享偏好设置方法,使其更加冗长,就像我已经完成here

一样