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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/756159.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中霖教育:一级建造师和一级造价师通过率高吗?

在建筑工业领域,一级建造师和一级造价工程师考试都是比较热门的考试,每年参加的人数都非常多,如果只备考一个的话,2024年选择哪项考试更为合适? 一建和一造的平均通过率均未超过10%,两者难度相近: 1. 一…

TCP粘包问题优化

TCP粘包问题是指在使用TCP协议进行数据传输时,由于TCP协议本身的特性,可能会导致多个数据包被粘在一起发送,或者在接收端接收到的数据包中包含了多个独立的数据包。这种情况可能会导致数据解析出错,从而影响应用程序的正常运行。 …

SpringBoot 中配置日期格式

SpringBoot 中配置日期格式 这个错误提示表明在尝试将一个字符串转换成 java.util.Date 类型时失败了,因为字符串的格式不符合预期的日期格式。在你的情况下,字符串 “2024-03-14 18:55:55” 似乎不符合默认的日期格式。 解决这个问题的方法之一是告诉…

力扣刷题---岛屿问题--c++

DFS:深度优先遍历:深度优先遍历是一种优先走到底、无路可走再回头的遍历方式 我们所熟悉的 DFS(深度优先搜索)问题通常是在树或者图结构上进行的。而我们今天要讨论的 DFS 问题,是在一种「网格」结构中进行的。岛屿问题…

源码部署LAMP架构

LAMP 文章目录 LAMP1. lamp简介2. web服务器工作流程2.1 cgi与fastcgi2.2 httpd与php结合的方式2.3 web工作流程 3. LAMP平台构建3.1 安装httpd3.2 安装mysql3.3 安装php3.4 验证 1. lamp简介 有了前面学习的知识的铺垫,今天可以来学习下第一个常用的web架构了。 …

【基于HTML5的网页设计及应用】——动态添加下拉菜单

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

TiDB分布式关系型数据库

TiDB分布式关系型数据库 什么是TiDBTiDB结构TiDB的热点问题 什么是TiDB TiDB 是一个开源的分布式关系型数据库,由 PingCAP 公司主导开发。它的设计目标是提供水平可扩展的高性能分布式事务数据库,同时保持与 MySQL 协议的兼容性和事务的 ACID&#xff0…

什么是增强型SSL证书?购买一张需要多少钱?

增强型SSL证书是一种提供更高级别安全验证与用户信任度的网络安全工具,也被称为EV证书。相较于DV(域名验证)和OV(组织验证)证书,它通过严格的身份核实流程确保网站所有者的合法性和真实性。 首先&#xff0…

vue事件绑定引发的性能问题

Vue事件绑定中,为每个动态创建的元素都基于addEventListener做了事件绑定,可能会导致性能问题,因为在绑定的方法中需要用到每次循环的信息,会创建多个闭包。 因为在循环中使用事件绑定会导致大量的事件监听器被创建,这…

【C++】string 类---字符判断与大小写转换(超详细解析!)

目录 一、string 类的介绍 二、字符大小写转换与判断常用函数 💦 字符大小写判断 ① isalpha() ② isalnum() ③ isdigit() ④ islower() ⑤ isupper() 💦 字符大小写转换 ① tolower() ✨方法一: ✨方法二: ② toupper() ✨方…

【NLP8-Transformer】

Transformer 1、优势 相比之前占领市场的LSTM和GRU模型,Transformer有两个显著优势 1、Transformer能够利用分布式GPU进行并行训练,提升模型训练效率 2、在分析预测更长的文本时,捕捉间隔较长的语义关联效果更好。 2、Transformer模型的…

【MySQL】MySQL视图

文章目录 一、视图的基本使用1.创建视图2.修改了视图,对基表数据有影响3.修改了基表,对视图有影响4.删除视图 二、视图规则和限制 一、视图的基本使用 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称…

【springboot】@SpringBootApplication 加载原理解析

从何处放入 AutoConfigurationImportSelector.selectImports AbstractApplicationContext.refresh AbstractApplicationContext.invokeBeanFactoryPostProcessors PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors 此处一个关键信息 只有BeanDefinition…

Android11 HID开发系统源码配置

# RK356X_ANDROID11_CUSTOM_HID ## 1.确认SDK版本。 cat .repo/manifests/include/rk356x_repository.xml <?xml version="1.0" encoding="UTF-8"?> <manifest> <project path="device/rockchip/rk356x" name="rk/dev…

Html Open with Live Server 报错windows找不到文件

输入setting.json 填入你的浏览器路径 即可

字符串篇(三)

文章目录 1.18 islower()函数1.19 isnumeric()函数1.20 isprintable()函数1.21 isspace()函数1.22 istitle()函数1.23 isupper()函数1.24 join()函数1.25 len()函数 1.18 islower()函数 islower() 是 Python 中字符串&#xff08;str&#xff09;对象的一个方法&#xff0c;用…

【Qt】Qt代码格式化配置

这里记录一下个人使用的格式化配置: 个人使用的格式化工具Artistic Style格式化信息&#xff1a; --stylelinux #&#xff1a;Linux 风格格式和缩进 #--stylekr #indentspaces4 # 缩进采用4个空格 -A1 #使用AllMan程序风格&#xff0c;即大括号另起一行。 indent-switche…

java入门-变量与常量

java 基本语法-变量与常量 变量 变量的本质 程序中我们会经常看到类似 int x 3**;** 的表达式&#xff0c;x就是我们常说的变量&#xff0c;从计算机角度我们来看看变量x的本质是什么&#xff1f; 在程序开发中定义一个变量x, 计算机会在内存中开辟内存空间&#xff0c;计算…

测电笔与零火线

火线零线不分正负&#xff0c;因此即使接反电气仍可以使用&#xff0c;只是当开关断电的时候灯泡是有电的&#xff0c;此时比较危险容易触电。 火线和零线上的电流都是正弦波。简单的来讲&#xff0c;对于交流电路&#xff0c;电流一会从火线出发通过用电设备流向零线&#xff…

上位机图像处理和嵌入式模块部署(qmacvisual预处理实战)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面&#xff0c;我们说了图像预处理&#xff0c;但是没有给出相应的实战案例。今天还是有必要做一个说明的。预处理方法虽然相关的算法很多&#…