持续创作,加速成长!这是我参与「掘金日新计划 · 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();
}
}
-
存储的详细源码后面会有专门文章进行讲解,这里只是简单进行分析。
-
前面主要是做一些能否存储数据的判断,比如是否允许存储,后面会有讲解,再比如如果准备写入的值和上次存储的值相同,也跳过下面的存储逻辑。
-
存储的实现我们可以自定义,对应的就是上面的
PreferenceDataStore不等于null,关于自定义存储后面我们也会有专门的文章进行详细讲解,默认我们使用上面的第2步逻辑SharedPreference实现存储。
操作Preference Library使用的SharedPreference
之前的文章有提到,设置项存储到SharedPreference中使用的key值就是在xml中配置的app:key属性:
接下来我们看下如何获取到这个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="开发者选项"/>
这个属性最终会解析成Preference的mPersistent属性中,当进行持久化操作时,会优先判断这个变量值决定是否存储:
这个shouldPersist()方法最终就会调用到mPersistent属性进行判断。
总结
本篇文章主要是对Preference Library的存储机制进行了一个简单的分析,解析下会单独出两篇文章分别讲解如何自定义Preference Library存储读写、监听设置项的配置变化。