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的常见方法如下:

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方法的实现。

相关推荐

  1. SharedPreferences解析

    2024-03-19 23:58:05       11 阅读
  2. 阅读llama笔记_1

    2024-03-19 23:58:05       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-19 23:58:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-19 23:58:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-19 23:58:05       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-19 23:58:05       20 阅读

热门阅读

  1. VirtualBox 无法打开终端肿么办

    2024-03-19 23:58:05       17 阅读
  2. MySQL数据库中的锁机制(通俗易懂)

    2024-03-19 23:58:05       18 阅读
  3. C语言中函数的递归

    2024-03-19 23:58:05       20 阅读
  4. Android 子系统

    2024-03-19 23:58:05       21 阅读
  5. C语言实现彩色文字闪烁效果

    2024-03-19 23:58:05       17 阅读
  6. 干好工作18法

    2024-03-19 23:58:05       16 阅读
  7. 从基础入门到学穿C++

    2024-03-19 23:58:05       22 阅读
  8. 隐私计算实训营第一期第1讲

    2024-03-19 23:58:05       18 阅读
  9. Vue打包问题汇总:legacy、runtime.js

    2024-03-19 23:58:05       19 阅读
  10. Windows下.ipynb文件,比较实用

    2024-03-19 23:58:05       17 阅读
  11. Mysql,MongoDB,Redis的横纵向对比

    2024-03-19 23:58:05       18 阅读
  12. LeetCode108 将有序数组转换为二叉搜索树

    2024-03-19 23:58:05       17 阅读