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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

转座子插入序列分析1-GENE-IS分析管道

如果你使用 GENE-IS: Saira Afzal et al。 ,2016请引用这篇研究文章。GENE-IS: time-efficient and accurate analysis of viral integration events in large-scale gene therapy data. Molecular Therapy - Nucleic Acids 2016, vol. 6:133-139. DOI:https://doi.…

做好外贸网站SEO优化,拓展海外市场

随着全球贸易的发展和互联网的普及,越来越多的外贸企业将目光投向了网络,希望通过建立网站来拓展海外市场。然而,在竞争激烈的外贸市场中,要让自己的网站脱颖而出,吸引更多的目标客户,就需要进行有效的SEO优…

StarRocks 记录

《实时数仓StarRocks集群部署》

提升Spring Boot应用性能的秘密武器:揭秘@Async注解的实用技巧

引言 在日常业务开发中,异步编程已成为应对并发挑战和提升应用程序性能的关键策略。传统的同步编程方式,由于会阻碍主线程执行后续任务直至程序代码执行结束,不可避免地降低了程序整体效率与响应速度。因此,为克服这一瓶颈&#…

win11环境安装VmwareLinux

VMware 安装Vmware 操作系统: win11 VM版本: 重启系统 输入许可证秘钥 安装centos finalshell连接linux服务 配置虚拟机运行状态 查询linux服务器的ip地址 下载finalshell 访问FinalShell官网 (hostbuf.com)

Spring6入门到高级-动力节点老杜

文章目录 OCP开闭原则依赖倒置原则控制反转依赖注入DISet方法注入构造注入 Sping特点代理模式代理模式中的角色动态代理JDK动态代理newProxyInstance() 的三个参数 JDK实现代理的步骤第一步:创建目标对象第二步:创建代理对象第三步:调用代理对…

C语言学习--八种排序算法

目录 排序的概念 1.直接插入排序 基本思想 代码实现 算法分析 2.希尔排序 基本思想 代码实现 算法分析 3.冒泡排序 基本思想 代码实现 算法分析 4.快速排序 基本思想 代码实现 算法分析 5.简单选择排序 基本思想 代码实现 算法分析 6.堆排序 基本思想 代…

合合信息扫描全能王亮相静安区3·15活动,AI扫描带来绿色消费新体验

保护消费者的合法权益,是全社会的共同责任。为优化消费环境、促进品质消费高地建设,打造安全优质和谐的消费环境,上海静安区消保委于3月15日举办静安区2024年“315”国际消费者权益日活动。 “激发消费活力,绿色低碳同行”是本次3…

Vue+SpringBoot打造民宿预定管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…

傻傻分不清目标检测、语义分割和实例分割,看这篇就够了

⭐️ 导言 随着深度学习技术的飞速发展,计算机视觉领域取得了巨大的进步。目标检测、语义分割和实例分割是计算机视觉中的重要任务,它们在图像理解和视频分析等方面发挥着关键作用。本文将深入探讨这三个任务的概念、原理、常用算法以及在实际应用中的案…

(css)vue 自定义背景 can‘t resolve

(css)vue 自定义背景 can’t resolve 旧写法: background-image: url(/assets/images/step-bg.jpg);background-size: 100% 100%; 新写法: background-image: url(~/assets/images/step-bg.jpg);background-size: 100% 100%; 解决参考:https…

shopee无货源出单了怎么发货?shopee怎么做无货源?

在Shopee的电商大舞台上,“无货源出单”就像是一场神奇的魔术表演。你的店铺是舞台,买家的订单是观众的掌声,而你,就是那位神秘的魔术师。订单来了,你却没有货?这可不是什么障碍,因为你有着更为…

算法详解——选择排序和冒泡排序

一、选择排序 选择排序算法的执行过程是这样的:首先,算法遍历整个列表以确定最小的元素,接着,这个最小的元素被置换到列表的开头,确保它被放置在其应有的有序位置上。接下来,从列表的第二个元素开始&#x…

[MySQL]数据库基础

文章目录 1.连接服务器2.理解mysql3.初见数据库4.主流数据库5.服务器,数据库,表关系6.数据逻辑存储7.MySQL架构8.SQL分类9.存储引擎 1.连接服务器 mysql -h 127.0.0.1 -P 3306 -u root -p -h:指明登录部署mysql服务的主机。没有写 -h 127.0.…

【链表】Leetcode 21. 合并两个有序链表【简单】

合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 解题思路 1、比较两个链表的头结点,选择其…

jumpserver管理集群

git地址:https://github.com/jumpserver/jumpserver.git 1、下载 jumpserver 需要docker来拉取镜像,没有的话会自动下载docker curl -sSL https://resource.fit2cloud.com/jumpserver/jumpserver/releases/latest/download/quick_start.sh | bash 拉取的…

Prometheus修改默认数据存储时间

Prometheus的默认数据存储时间可以通过修改启动脚本中的相关参数来调整。具体来说,可以通过修改--storage.tsdb.retention.time参数来改变数据保留的时长。该参数决定了何时删除旧数据,默认为15天。如果需要延长数据保留时间,可以将该参数的值…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Hyperlink)

超链接组件,组件宽高范围内点击实现跳转。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。该组件仅支持与系统浏览器配合使用。 需要权限 使用网络时,需要申请权限ohos.per…

AI论文速读 | UniST:提示赋能通用模型用于城市时空预测

本文是时空领域的统一模型——UniST,无独有偶,时序有个统一模型新工作——UniTS,感兴趣的读者也可以阅读今天发布的另外一条。 论文标题:UniST: A Prompt-Empowered Universal Model for Urban Spatio-Temporal Prediction 作者&…

大势智慧与云世纪签署战略合作,实景三维赋能低空经济,泛测绘助力城市数据更新更高效

2024年《政府工作报告》提出“要大力推进现代化产业体系建设,加快发展新质生产力”、“积极打造商业航天、低空经济等新增长引擎”。 近日,武汉大势智慧科技有限公司(以下简称“大势智慧”)和青岛云世纪信息科技有限公司&#xf…