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. 一…

力扣刷题---岛屿问题--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…

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

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

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

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

【MySQL】MySQL视图

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

【springboot】@SpringBootApplication 加载原理解析

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

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

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

【Qt】Qt代码格式化配置

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

java入门-变量与常量

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

测电笔与零火线

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

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

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

实现el-table合并列

效果图如下 <el-table :data"atlasDataList" style"width: 100%" :span-method"spanMethod"><el-table-column prop"stationName" label"" width"180" /><el-table-column prop"atlasNumbe…

中间件-消息队列

消息队列基础知识 什么是消息队列 本处提到的消息队列是指各个服务以及系统组件/模块之间的通信&#xff0c;属于一种中间件。参与消息传递的双方称为生产者和消费者&#xff0c;生产者负责发送消息&#xff0c;消费者负责处理消息。 消息队列作用 通过异步处理&#xff0…

你知道三拳打死镇关西的故事吗?郑屠户做了什么让鲁达竟将他置于死地?

你知道三拳打死镇关西的故事吗&#xff1f;郑屠户做了什么让鲁达竟将他置于死地&#xff1f; 《水浒传》第二集里&#xff0c;咱们看到了鲁提辖&#xff0c;也就是鲁达&#xff0c;他为啥要打郑屠户&#xff0c;也就是人们常说的镇关西。这鲁提辖可是个仗义疏财的好汉&#xf…

好委屈,东方甄选为何总是被供应商骗?

东方甄选最近很委屈。 315晚会过后&#xff0c;知名打假人王海爆料&#xff0c;称315晚会曝光的槽头肉扣肉在东方甄选和小杨哥的直播间里销售过。 东方甄选赶忙去问了问供应商情况。 供应商的回答让他感到暖心&#xff0c;表示虽然315晚会曝光了我们公司违规使用糟头肉&…

vue3项目

案例用到的知识点如下&#xff1a; ① vite 创建项目 ② 组件的封装与注册 ③ props ④ 样式绑定 ⑤ 计算属性 ⑥ 自定义事件 ⑦ 组件上的 v-model 效果如下图&#xff1b; 页面2 项目结构&#xff1a; 初始化项目 在终端运行以下的命令&#xff0c;初始化 vite 项目&#xf…

每日五道java面试题之mybatis篇(五)

目录&#xff1a; 第一题. 实体类属性名和表中字段名不⼀样 &#xff0c;怎么办?第二题. Mybatis是否可以映射Enum枚举类&#xff1f;第三题. Mybatis能执⾏⼀对⼀、⼀对多的关联查询吗&#xff1f;第四题. Mybatis是否⽀持延迟加载&#xff1f;原理&#xff1f;第五题. 如何获…

【项目实践day06】JWT令牌相关

什么是JWT 简洁的、自包含的格式&#xff0c;用于在通信双方以json数据格式安全的传输信息。 由于数字签名的存在&#xff0c;这些信息是可靠的。 jwt就是将原始的json数据格式进行了安全的封装&#xff0c;这样就可以直接基于jwt在通信双方安全的进行信息传输了。简洁&#…