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。
步骤:
- 添加依赖(app/build.gradle):
gradle
implementation "androidx.security:security-crypto:1.1.0-alpha06"
- 创建加密的 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", ""); // 自动解密
四、注意事项
- 存储路径:数据默认保存在 /data/data/<应用包名>/shared_prefs/ 目录下,root 设备可直接查看(未加密时)。
- 数据大小限制:建议单条数据不超过 100KB,总数据量不超过 1MB,否则可能影响性能。
- 线程安全:apply() 是异步的,多线程同时写入可能导致数据覆盖,需自行保证线程安全。
- 模式参数:Android 7.0 后仅支持 MODE_PRIVATE,其他模式(如 MODE_WORLD_READABLE)已废弃。
五、总结
SharedPreferences 是 Android 轻量级存储的首选方案,核心流程:
获取实例 → 编辑器存储 → 提交数据 → 读取数据。
适合简单配置,敏感数据需加密,大量数据建议用数据库。
