当前位置: 首页 > news >正文

SharedPreferences的使用方法

在 Android 中,SharedPreferences 是一种轻量级的键值对(Key-Value)存储方式,主要用于保存少量简单的配置信息(如用户偏好设置、登录状态等)。数据以 XML 文件形式存储在应用的私有目录中,仅当前应用可访问。

一、基本使用步骤

1. 获取 SharedPreferences 对象

通过 Context 的 getSharedPreferences() 方法获取,需要两个参数:

  • name:存储文件的名称(无需扩展名,最终会生成 name.xml 文件)。
  • mode:操作模式(仅支持 MODE_PRIVATE,表示数据私有,其他应用无法访问)。

java

运行

// 在 Activity 中获取(name 为 "app_config",模式为私有)

SharedPreferences sp = getSharedPreferences("app_config", Context.MODE_PRIVATE);

简化方式:若只需一个默认的存储文件,可使用 PreferenceManager:

java

运行

// 获取默认的 SharedPreferences(文件名为包名_preferences)

SharedPreferences defaultSp = PreferenceManager.getDefaultSharedPreferences(this);

2. 存储数据(通过 Editor)

SharedPreferences 本身不能直接修改数据,需通过 edit() 方法获取 Editor 编辑器,调用 putXxx() 方法存储数据,最后用 apply() 或 commit() 提交。

java

运行

// 1. 获取编辑器

SharedPreferences.Editor editor = sp.edit();

// 2. 存储数据(支持多种类型)

editor.putString("username", "张三");       // 字符串

editor.putInt("age", 25);                  // 整数

editor.putBoolean("is_login", true);       // 布尔值

editor.putFloat("weight", 65.5f);          // 浮点数

editor.putLong("login_time", System.currentTimeMillis()); // 长整数

// 3. 提交数据(两种方式)

editor.apply(); // 异步提交(推荐,不阻塞主线程,无返回值)

// editor.commit(); // 同步提交(返回 boolean 表示是否成功,可能阻塞 UI 线程)

3. 读取数据

通过 getXxx() 方法读取数据,需传入 键名 和 默认值(当键不存在时返回默认值)。

java

运行

// 读取数据

String username = sp.getString("username", "未知用户"); // 默认值 "未知用户"

int age = sp.getInt("age", 0); // 默认值 0

boolean isLogin = sp.getBoolean("is_login", false); // 默认值 false

float weight = sp.getFloat("weight", 0.0f); // 默认值 0.0f

long loginTime = sp.getLong("login_time", 0); // 默认值 0

4. 修改与删除数据

  • 修改数据:直接用 putXxx() 覆盖原有键的值,再提交。
  • 删除数据:使用 remove(key) 删除指定键,或 clear() 清空所有数据。

java

运行

SharedPreferences.Editor editor = sp.edit();

// 修改数据(覆盖原有值)

editor.putInt("age", 26);

// 删除指定键

editor.remove("weight");

// 清空所有数据(谨慎使用)

// editor.clear();

editor.apply();

二、使用场景

适合存储 少量、简单的配置信息,例如:

  • 用户登录状态(是否自动登录)。
  • 应用主题设置(深色 / 浅色模式)。
  • 界面偏好(字体大小、是否显示引导页)。
  • 临时缓存的小数据(如最后一次浏览的页面 ID)。

不适合场景

  • 大量数据(如列表、复杂对象):建议用数据库(Room)。
  • 敏感数据(如密码、Token):需加密后存储(见下文)。

三、高级用法

1. 监听数据变化

通过 registerOnSharedPreferenceChangeListener 监听数据变化,当指定键的值被修改时触发回调。

java

运行

// 定义监听器

private SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {

    @Override

    public void onSharedPreferenceChanged(SharedPreferences sp, String key) {

        // 当 key 对应的数据变化时执行

        if ("username".equals(key)) {

            String newName = sp.getString(key, "");

            Log.d("SP", "用户名已更新为:" + newName);

        }

    }

};

// 注册监听器(如在 onCreate 中)

sp.registerOnSharedPreferenceChangeListener(listener);

// 取消注册(如在 onDestroy 中,避免内存泄漏)

@Override

protected void onDestroy() {

    super.onDestroy();

    sp.unregisterOnSharedPreferenceChangeListener(listener);

}

2. 加密存储敏感数据

SharedPreferences 存储的数据是明文的(XML 文件可直接查看),敏感数据(如密码、Token)需加密。推荐使用 AndroidX 的 EncryptedSharedPreferences。

步骤

  1. 添加依赖(app/build.gradle):

gradle

implementation "androidx.security:security-crypto:1.1.0-alpha06"

  1. 创建加密的 SharedPreferences:

java

运行

import androidx.security.crypto.EncryptedSharedPreferences;

import androidx.security.crypto.MasterKeys;

// 创建主密钥(用于加密)

String masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC);

// 创建加密的 SharedPreferences

SharedPreferences encryptedSp = EncryptedSharedPreferences.create(

    "secure_config", // 文件名

    masterKeyAlias,

    this, // Context

    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,

    EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM

);

// 用法与普通 SharedPreferences 一致(自动加密)

encryptedSp.edit().putString("token", "xxx123456").apply();

String token = encryptedSp.getString("token", ""); // 自动解密

四、注意事项

  1. 存储路径:数据默认保存在 /data/data/<应用包名>/shared_prefs/ 目录下,root 设备可直接查看(未加密时)。
  2. 数据大小限制:建议单条数据不超过 100KB,总数据量不超过 1MB,否则可能影响性能。
  3. 线程安全:apply() 是异步的,多线程同时写入可能导致数据覆盖,需自行保证线程安全。
  4. 模式参数:Android 7.0 后仅支持 MODE_PRIVATE,其他模式(如 MODE_WORLD_READABLE)已废弃。

五、总结

SharedPreferences 是 Android 轻量级存储的首选方案,核心流程:

获取实例 → 编辑器存储 → 提交数据 → 读取数据

适合简单配置,敏感数据需加密,大量数据建议用数据库。

http://www.dtcms.com/a/519688.html

相关文章:

  • PRCV 2025:文本何以成为 AGI 的必经之路?
  • 一位C++低延迟交易系统开发工程师的有趣开发经历
  • 如何为自己的店铺做网站建立的英语
  • 使用 Datasmith 将 Rhino 模型导入 Unreal Engine 5(UE5)
  • 怎么注册17做网站初学者做网站的软件
  • 【数据结构】基于Prim算法的最小生成树
  • Snipaste (截图贴图工具) 精准截图 中文免费版
  • C语言内存机制深度解析:指针运算、数组与字符串实战指南
  • 强化学习 深度学习 深度强化学习 有什么区别
  • 《FastAPI零基础入门与进阶实战》第23篇:mysql/HeidiSQL安装与利用HeidiSQL数据迁移
  • 可克达拉市建设局网站番禺厂家关键词优化
  • 注册公司在哪个网站系统微信crm系统如何添加
  • 深入 YOLOv5 数据增强:从 create_dataloader 到马赛克范围限定
  • 如果战国时候魏国,向西灭掉秦国为战略纵深,然后向东争夺天下 可行吗
  • Docker MailServer自建邮件服务器
  • 【CRC校验】CRC(循环冗余校验)算法介绍
  • SpringAI 内嵌模型 ONNX
  • 哪些平台制作网站硬件开发和软件开发
  • 网站设计功能编程网站有哪些
  • Volatility2在kali安装
  • Euler
  • 提示学习思想
  • 《图解技术体系》Wonderful talk AI ~~AI“Emerging”
  • k8s部署容器化应用-nginx2
  • 谈谈你对iOS的runtime和runloop的了解
  • Blender入门学习05 - 材质
  • 沂源网站网站页面设计图片素材
  • 做网站推广引流效果好吗黑料社2023
  • 抽水蓄能电站的最佳调度方案研究Matlab仿真
  • VTK入门:vtkPolyData——3D几何的“乐高积木盒