Android源码阅读 SharedPreferences - 1

目录

前言

正文

SharedPreferences.java

PreferenceManager.java

ContextImpl.java


前言

由于笔者目前水平限制,表达能力有限,尽请见谅。

SharedPreferences提供了一种轻量级的数据存储方式,允许保存和获取简单的键值对。它适用于保存少量的数据,如用户设置或应用程序的配置信息。

在深入源码之前,先了解一下SharedPreferences的基本用法:

  • 读取数据 :使用SharedPreferences对象的getInt(), getString()等方法来获取存储的数据。
  • 保存数据 :要保存数据,首先需要通过SharedPreferences.edit()获取SharedPreferences.Editor对象,然后调用putInt(), putString()等方法来保存键值对,最后调用apply()commit()提交修改。

正文

欲要深入SharedPreferences,则必须要先知道PreferenceManager。

  • 作用PreferenceManager是一个帮助类,用于简化SharedPreferences的访问和操作。它提供了获取SharedPreferences实例的静态方法。

一种获取SharedPreferences的常见方法如下:

java 复制代码
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

要注意的是SharedPreferences其实是一个接口,接口定义了数据存储和访问的方法,允许读取和写入键值对数据,这里是通过PreferenceManager提供的获取SharedPreferences实例的静态方法来获取的实例。

SharedPreferences.java

部分源码如下,这里面定义了许多用于数据存储和访问的方法,但它本身并不提供具体的实现细节。实际的实现是由系统在PreferenceManager.getDefaultSharedPreferences()方法调用时提供的。

PreferenceManager负责创建SharedPreferences的实例,并确保这些实例适合于应用的上下文和特定的存储需求。

当调用PreferenceManager.getDefaultSharedPreferences()时,这个方法会根据应用上下文返回一个默认的SharedPreferences实例。这个实例是应用级别的,意味着它可以被应用中的任何组件访问,前提是这些组件有相同的上下文。

具体的,大致有如下接口:

OnSharedPreferenceChangeListener接口

当共享偏好发生改变时,这个回调接口会被触发。

此接口监听SharedPreferences的变化,如当某个偏好被改变、添加或移除。

Editor接口

用于修改SharedPreferences对象中的值。所有的改动都被批处理,直到调用commit()apply()才被应用到SharedPreferences对象中。

  • 主要方法
    • putString(), putStringSet(), putInt(), putLong(), putFloat(), putBoolean():用于存储不同类型的数据。
    • remove():移除某个偏好设置。
    • clear():清除所有偏好设置。
    • commit():同步地提交修改到持久化存储中。
    • apply():异步地提交修改到持久化存储中。

SharedPreferences接口内部的其他主要方法

  • getAll():检索所有的偏好设置键值对。
  • getString(), getStringSet(), getInt(), getLong(), getFloat(), getBoolean():用于获取存储的值。如果指定的键不存在,则返回默认值。
  • contains():检查是否存在指定的键。
  • edit() :获取一个Editor对象,用于修改偏好设置。
  • registerOnSharedPreferenceChangeListener()unregisterOnSharedPreferenceChangeListener():用于注册和注销偏好变更的监听器。

但是这些方法本身没有在SharedPreferences内部实现。

PreferenceManager.java

对于PreferenceManager.getDefaultSharedPreferences(this);

默认包名就是context.getPackageName() + "_preferences",默认模式就是private模式即创建的文件只能被调用的应用访问

but 但是,深挖这个私有模式,我们可以发现

这些共享了用户ID的应用可以相互访问彼此的MODE_PRIVATE文件,毕竟从操作系统的角度看,它们被视为同一个用户运行。

至于context.getSharedPreferences方法

它是是由Android运行时提供的,其实现隐藏在Android系统的源码中。

他会检索并保持偏好文件name的内容,返回一个可以通过其检索和修改值的SharedPreferences对象,对于相同名称,只返回一个SharedPreferences对象实例给所有调用者,这意味着"他们"会立即看到彼此所做的编辑。

线程安全,如果不存在这个文件就会创建这个文件。

要进一步了解,我们又需要去了解ContextImpl类和SharedPreferencesImpl类

ContextImpl.java

ContextImplContext抽象类的一个具体实现。在Android中,Context是一个抽象类,它提供了访问应用资源、启动活动、发送广播、接收意图等一系列操作的接口。Context是一个场景描述符,它提供了与操作系统交互的接口。

  • 作用ContextImpl实现了这些操作的具体逻辑,使得应用程序能够与Android运行时环境进行交互。每当应用需要使用资源、启动新活动、使用服务等时,ContextImpl都在幕后发挥作用。
  • 应用中的使用 :尽管开发者在应用程序中通常是通过ActivityService等类直接或间接地使用Context,但这些类都是在内部通过继承ContextWrapperContextWrapper又是Context的一个子类)来包装ContextImpl的实例。

下一篇进行深入ContextImpl.java类里getSharedPreferences方法的实现。

相关推荐
黄林晴34 分钟前
如何判断手机是否是纯血鸿蒙系统
android
火柴就是我42 分钟前
flutter 之真手势冲突处理
android·flutter
法的空间1 小时前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
循环不息优化不止1 小时前
深入解析安卓 Handle 机制
android
恋猫de小郭1 小时前
Android 将强制应用使用主题图标,你怎么看?
android·前端·flutter
道可到1 小时前
Java 反射现代实践速查表(JDK 11+/17+)
java
jctech2 小时前
这才是2025年的插件化!ComboLite 2.0:为Compose开发者带来极致“爽”感
android·开源
用户2018792831672 小时前
为何Handler的postDelayed不适合精准定时任务?
android
道可到2 小时前
Java 反射现代实践指南(JDK 11+ / 17+ 适用)
java
玉衡子2 小时前
九、MySQL配置参数优化总结
java·mysql