元婴篇:设置界面的开发利器Preference Library,了解一下~

407 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情

接下来会对Preference Library官方库进行一个系列讲解,本篇文章是Preference Library系列的第三篇,主要是介绍Preference Library数据存储相关知识点。

历史文章

练气篇:设置界面的开发利器Preference Library,了解一下~

筑基篇:设置界面的开发利器Preference Library,了解一下~

金丹篇:设置界面的开发利器Preference Library,了解一下~

浅析源码中的存储入口

Preeference Library中设置的值默认最终是保存到到大家熟知的SharedPreference中,我们直接简单看下Preference源码中保存到SharedPreference的入口方法:

protected boolean persistString(String value) {
    if (!shouldPersist()) {
        return false;
    }

    // Shouldn't store null
    if (TextUtils.equals(value, getPersistedString(null))) {
        return true;
    }

    PreferenceDataStore dataStore = getPreferenceDataStore();
    if (dataStore != null) {
        //1. 自定义存储
        dataStore.putString(mKey, value);
    } else {
        //2. 默认存储
        SharedPreferences.Editor editor = mPreferenceManager.getEditor();
        editor.putString(mKey, value);
        tryCommit(editor);
    }
    return true;
}
private void tryCommit(@NonNull SharedPreferences.Editor editor) {
    if (mPreferenceManager.shouldCommit()) {
        editor.apply();
    }
}
  1. 存储的详细源码后面会有专门文章进行讲解,这里只是简单进行分析。

  2. 前面主要是做一些能否存储数据的判断,比如是否允许存储,后面会有讲解,再比如如果准备写入的值和上次存储的值相同,也跳过下面的存储逻辑。

  3. 存储的实现我们可以自定义,对应的就是上面的PreferenceDataStore不等于null,关于自定义存储后面我们也会有专门的文章进行详细讲解,默认我们使用上面的第2步逻辑SharedPreference实现存储。

操作Preference Library使用的SharedPreference

之前的文章有提到,设置项存储到SharedPreference中使用的key值就是在xml中配置的app:key属性:

image.png

接下来我们看下如何获取到这个SharedPreference对象:

val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this.requireContext())

很简单,调用getDefaultSharedPreferences()即可,拿到了SharedPreference就可以对里面存储的值进行各种各样的操作了。

设置项如何不持久化到本地

可能有时候,我们不想要将某个设置项的配置写入到SharedPreference中,直接通过app:persistent即可搞定:

<Preference
    app:persistent="false"
    app:icon="@drawable/ic_launcher_foreground"
    app:key="develop"
    app:title="开发者选项"/>

这个属性最终会解析成PreferencemPersistent属性中,当进行持久化操作时,会优先判断这个变量值决定是否存储:

image.png

这个shouldPersist()方法最终就会调用到mPersistent属性进行判断。

总结

本篇文章主要是对Preference Library的存储机制进行了一个简单的分析,解析下会单独出两篇文章分别讲解如何自定义Preference Library存储读写、监听设置项的配置变化。