目录
前言
由于笔者目前水平限制,表达能力有限,尽请见谅。
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
ContextImpl
是Context
抽象类的一个具体实现。在Android中,Context
是一个抽象类,它提供了访问应用资源、启动活动、发送广播、接收意图等一系列操作的接口。Context
是一个场景描述符,它提供了与操作系统交互的接口。
- 作用 :
ContextImpl
实现了这些操作的具体逻辑,使得应用程序能够与Android运行时环境进行交互。每当应用需要使用资源、启动新活动、使用服务等时,ContextImpl
都在幕后发挥作用。 - 应用中的使用 :尽管开发者在应用程序中通常是通过
Activity
、Service
等类直接或间接地使用Context
,但这些类都是在内部通过继承ContextWrapper
(ContextWrapper
又是Context
的一个子类)来包装ContextImpl
的实例。
下一篇进行深入ContextImpl.java类里getSharedPreferences方法的实现。