SharedPreferences源码分析
# SharedPreferences源码分析
这是第一篇源码分析文章,希望能开个好头。
之前不知道去哪里查看源码,查了一下资料,可以在 https://cs.android.com/ 去搜索Android的源码
从`SharedPreferences sp = getSharedPreferences("data",MODE_PRIVATE);`开始分析
在Android studio里面点击源码,会跳转到Context类的同名抽象方法
```
public abstract SharedPreferences getSharedPreferences(String name, @PreferencesMode int mode);
```
由于这是一个抽象方法,所以得要找到他的实现类
在cs.android.com里搜索`public abstract class Context`,也就是Context类,来到了`frameworks/base/core/java/android/content/Context.java`
然后搜索`getSharedPreferences`方法,在左侧可以看到筛选出来的结果

按住control,顺着点击方法,可以在下面的「覆盖来源」部分,看到抽象类的具体实现,Context的具体实现类就是ContextImpl,点进去就是我们想要看的源码了。

上代码
- ContextImpl.class
```
@Override
public SharedPreferences getSharedPreferences(String name, int mode) {
// At least one application in the world actually passes in a null
// name. This happened to work because when we generated the file name
// we would stringify it to "null.xml". Nice.
if (mPackageInfo.getApplicationInfo().targetSdkVersion <
Build.VERSION_CODES.KITKAT) {
if (name == null) {
name = "null";
}
}
File file;
synchronized (ContextImpl.class) {
if (mSharedPrefsPaths == null) {
mSharedPrefsPaths = new ArrayMap<>();
}
// 根据name取文件
file = mSharedPrefsPaths.get(name);
if (file == null) {
// 没有取到文件,新建文件
file = getSharedPreferencesPath(name);
mSharedPrefsPaths.put(name, file);
}
}
return getSharedPreferences(file, mode);
}
```
可以看明显的看到最后还是调用了` public SharedPreferences getSharedPreferences(File file, int mode)`方法去实现,也就是我们常用的name作为形参的方法,实际上只是提供了一个方便访问file的快捷方法。
首先看`synchronized (ContextImpl.class)`这句话,说实话这个写法我还真没怎么用过。参考 [Synchronized的四种用法](https://blog.csdn.net/luoweifu/article/details/46613015)
synchronized修饰类的时候,synchronized作用于类T,是给这个类T加锁,T的所有对象用的是同一把锁。也就是方法体内,对对象的方法调用,同一时间只能有一个对象拿到锁,去执行操作。其实效果和synchronized修饰静态方法是一样的,因为我们知道:静态方法是属于类的而不属于对象的。同样的,synchronized修饰的静态方法锁定的是这个类的所有对象。
---
【参考文章】
- [SharedPreferences 源码解析:自带的轻量级 K-V 存储库](https://juejin.im/post/6844904036714430472)