使用 SharedPreferences 保存简单数据

如果您有一组相对较小的键值对需要保存,您可以使用SharedPreferences API。一个SharedPreferences对象指向一个包含键值对的文件,并提供简单的方法来读取和写入它们。每个SharedPreferences文件都由框架管理,可以是私有的或共享的。

此页面将向您展示如何使用SharedPreferences API 来存储和检索简单值。

获取共享首选项的句柄

您可以通过调用以下方法之一来创建新的共享首选项文件或访问现有文件

  • getSharedPreferences()如果您需要多个以名称标识的共享首选项文件,请使用此方法,您可以在第一个参数中指定名称。您可以从应用中的任何Context调用此方法。
  • getPreferences()如果您只需要为活动使用一个共享首选项文件,请从Activity中使用此方法。因为这会检索属于该活动的默认共享首选项文件,所以您无需提供名称。

例如,以下代码访问由资源字符串R.string.preference_file_key标识的共享首选项文件,并使用私有模式打开它,以便只有您的应用可以访问该文件

Kotlin

val sharedPref = activity?.getSharedPreferences(
        getString(R.string.preference_file_key), Context.MODE_PRIVATE)

Java

Context context = getActivity();
SharedPreferences sharedPref = context.getSharedPreferences(
        getString(R.string.preference_file_key), Context.MODE_PRIVATE);

命名共享首选项文件时,应使用对您的应用唯一可识别的名称。一种好的做法是在文件名之前添加您的应用程序 ID。例如:"com.example.myapp.PREFERENCE_FILE_KEY"

或者,如果您只需要为您的活动使用一个共享首选项文件,您可以使用getPreferences()方法

Kotlin

val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE)

Java

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);

如果您正在使用SharedPreferences API 保存应用设置,则应改为使用getDefaultSharedPreferences()来获取整个应用的默认共享首选项文件。有关更多信息,请参阅设置开发者指南

写入共享首选项

要写入共享首选项文件,请通过对您的SharedPreferences调用edit()来创建一个SharedPreferences.Editor

使用诸如 putInt()putString() 等方法传递您想要写入的键和值。然后调用 apply()commit() 来保存更改。例如

Kotlin

val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
with (sharedPref.edit()) {
    putInt(getString(R.string.saved_high_score_key), newHighScore)
    apply()
}

Java

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score_key), newHighScore);
editor.apply();

apply() 会立即更改内存中的 SharedPreferences 对象,但会异步地将更新写入磁盘。或者,您可以使用 commit() 同步地将数据写入磁盘。但由于 commit() 是同步的,因此您应该避免从主线程调用它,因为它可能会暂停您的 UI 渲染。

从共享首选项读取

要从共享首选项文件中检索值,请调用诸如 getInt()getString() 等方法,提供您想要的键值,并可选地提供一个默认值,如果键不存在则返回该值。例如

Kotlin

val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
val defaultValue = resources.getInteger(R.integer.saved_high_score_default_key)
val highScore = sharedPref.getInt(getString(R.string.saved_high_score_key), defaultValue)

Java

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int defaultValue = getResources().getInteger(R.integer.saved_high_score_default_key);
int highScore = sharedPref.getInt(getString(R.string.saved_high_score_key), defaultValue);