Google 致力于为黑人社区推动种族平等。查看具体举措

保存键值对数据

如果您有想要保存的相对较小键值对集合,则应使用 SharedPreferences API。SharedPreferences 对象指向包含键值对的文件,并提供读写这些键值对的简单方法。每个 SharedPreferences 文件均由框架进行管理,可以是私有文件,也可以是共享文件。

本页介绍了如何使用 SharedPreferences API 存储和检索简单值。

注意SharedPreferences API 用于读写键值对,不要将它们与 Preference API 混淆,后者可帮助您构建用于显示应用设置的界面(虽然它们也使用 SharedPreferences 保存用户设置)。如需了解 Preference API,请参阅设置开发者指南

获取共享偏好设置的句柄

您可以通过调用以下方法之一创建新的共享偏好设置文件或访问已有共享偏好设置文件:

  • getSharedPreferences() - 如果您需要多个由名称(使用第一个参数指定)标识的共享偏好设置文件,则使用此方法。您可以从您的应用中的任何 Context 调用此方法。
  • getPreferences() - 如果您只需使用 Activity 的一个共享首选项,请从 Activity 中使用此方法。由于这会检索属于该 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"

或者,如果您只需要 Activity 的一个共享偏好设置文件,则可以使用 getPreferences() 方法:

Kotlin

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

Java

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

注意:自 API 级别 17 起,MODE_WORLD_READABLEMODE_WORLD_WRITEABLE 模式已被弃用。 从 Android 7.0(API 级别 24)开始,如果您使用这些模式,Android 会抛出 SecurityException。如果您的应用需要与其他应用共享私有文件,可以通过 FLAG_GRANT_READ_URI_PERMISSION 使用 FileProvider。如需了解详情,另请参阅共享文件

如果您使用 SharedPreferences API 保存应用设置,则应改用 getDefaultSharedPreferences() 获取整个应用的默认共享偏好设置文件。如需了解详情,请参阅设置开发者指南

写入共享偏好设置

如需写入共享偏好设置文件,请通过对您的 SharedPreferences 调用 edit() 以创建一个 SharedPreferences.Editor

注意:通过对 EncryptedSharedPreferences 对象(而不是 SharedPreferences 对象)调用 edit() 方法,您可以更安全地修改共享偏好设置。如需了解详情,请参阅有关如何更安全地处理数据的指南。

传递您想要使用 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)
        commit()
    }
    

Java

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

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

从共享偏好设置中读取

如需从共享偏好设置文件中检索值,请调用 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);