用户偏好文件 vs 应用程序偏好文件

9
我的安卓应用有两种偏好设置:
1) 我在res/xml/preferences.xml中定义了用户偏好设置,以便用户可以使用PreferenceActivity管理他们的偏好设置。
2) 我想为我的应用程序定义另一个文件,用于全局配置偏好设置
最好的方法是如何管理我的应用程序配置偏好设置?我应该创建另一个XML文件来存储配置值,还是应该在strings.xml中指定这些配置值?管理配置偏好设置的最佳实践是什么?
3个回答

6

设置偏好文件并没有保存在项目的 /res/xml/defaults.xml 文件中。

它们存储在设备上你的应用程序文件夹中,类似于:

/data/data/com.your.pkg/default.prefs

尽量不要指定文件名,因为您将在首选项文件上遇到一些问题,就像此 OP 在此问题中所遇到的那样:如何使Android中的首选项工作?

SharedPreferences preferences = PreferenceManager
                    .getDefaultSharedPreferences(context);

那么您可能需要查询。
preferences.getString('weightPref', null);

许多应用程序可能提供一种捕获特定应用程序或活动设置上用户偏好的方法。为此,Android提供了一组简单的API。首选项通常是名称值对。它们可以作为“共享首选项”存储在应用程序中的各个活动中(请注意,目前无法跨进程共享)。或者它可能是需要针对某个活动存储的内容。
1. 共享首选项:所有组件(活动、服务等)都可以使用共享首选项。 2. 活动处理的首选项:这些首选项只能在活动内部使用,不能由应用程序的其他组件使用。
共享首选项:使用Context类的getSharedPreferences方法来管理共享首选项。首选项存储在默认文件(1)中,或者您可以指定一个文件名(2)来引用首选项。
(1)以下是当您指定文件名时获取实例的方法
public static final String PREF_FILE_NAME = "PrefFile";
   SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);

MODE_PRIVATE是偏好设置的操作模式。它是默认模式,意味着创建的文件只能被调用应用程序访问。还支持其他两种模式:MODE_WORLD_READABLEMODE_WORLD_WRITEABLE。在MODE_WORLD_READABLE中,其他应用程序可以读取创建的文件,但不能修改它。在MODE_WORLD_WRITEABLE的情况下,其他应用程序也可以对创建的文件进行写入操作。

(2) 推荐的方法是使用默认模式,不指定文件名。

SharedPreferences preferences = PreferencesManager.getDefaultSharedPreferences(context);

最后,一旦您获得了偏好实例,以下是如何从偏好中检索存储的值:

 int storedPreference = preferences.getInt("storedInt", 0);

要在偏好文件中存储值,必须使用SharedPreference.Editor对象。 EditorSharedPreference类的嵌套接口。

SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // value to store
editor.commit();

编辑器还支持remove()clear()等方法,用于从文件中删除首选项值。

活动首选项:

共享首选项可以被其他应用程序组件使用。但是,如果您不需要与其他组件共享首选项,并且希望拥有活动的私有首选项,则可以使用活动的getPreferences()方法来实现。 getPreference方法使用活动类的名称作为首选项文件名,调用getSharedPreferences()方法。

以下是获取首选项的代码:

SharedPreferences preferences = getPreferences(MODE_PRIVATE);
int storedPreference = preferences.getInt("storedInt", 0);

存储值的代码与共享首选项相同。

SharedPreferences preferences = getPreference(MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // value to store
editor.commit();

您还可以使用其他方法,例如将活动状态存储在数据库中。请注意,Android还包含一个名为android.preference的包。该包定义了实现应用程序首选项UI的类。

要查看更多示例,请查看Android开发者网站上有关数据存储的文章。


请不要使用“这里”或“点击此处”作为链接文本(http://www.w3.org/QA/Tips/noClickHere.html)。谢谢! - Joachim Sauer
我想做的是一方面在res/xml/preferences.xml中定义一个带有默认值的用户首选项xml文件,正如你所提到的,我可以使用以下代码获取这些首选项:PreferenceManager.getDefaultSharedPreferences(context);另一方面,我想在另一个文件中定义另一种类型的首选项来配置我的应用程序(用户无法管理这些配置首选项,只有我的应用程序代码才能读取它们)。我的问题是,如果我已经有一个用户首选项文件(res/xml/preferences.xml),那么在哪里可以指定这些配置首选项的默认值? - user332563

1

假设您的XML文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
   <CheckBoxPreference android:key="gpsOn" 
                    android:summaryOff="GPS is Off"
                    android:summaryOn="GPS is On" 
                    android:title="GPS State"></CheckBoxPreference>

我假设您使用PreferenceActivity从xml中加载首选项。因此,在您的活动中,您可以执行addPreferencesFromResource(R.xml.application_pref);

这样做时,默认情况下,所有值都存储在应用程序的默认SharedPreference中。您可以在任何地方访问这些首选项。因此,从其他活动/服务中只需执行:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
boolean value = prefs.getBoolean("gpsOn", false);

就像这样,您应该在value中获取用户的偏好。


0

为应用程序设置全局配置首选方式可能是在Android清单中定义元数据元素


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接