SharedPreferences 详解
1. SharedPreferences 概述
1.1 SharedPreferences 简介
1.1.1 SharedPreferences 定义
- SharedPreferences 是 Android 平台上一个轻量级的存储方案,用于存储应用中的简单数据,如字符串、布尔值、整数等。
- SharedPreferences 采用键值对的形式进行数据存储,具有读写速度快、跨进程通信等优点。
1.1.2 SharedPreferences 应用场景
- 存储用户设置,如主题颜色、字体大小等。
- 存储临时数据,如用户登录状态、缓存数据等。
- 实现简单的数据同步,如多设备间的数据同步。
1.2 SharedPreferences 数据类型
1.2.1 基本数据类型
- 字符串(String)
- 整数(Integer)
- 浮点数(Float)
- 长整型(Long)
- 布尔值(Boolean)
- 字符串集合(String array)
- 布尔值数组(Boolean array)
1.2.2 复杂数据类型
- 可以使用 JSON 或其他序列化方式将复杂数据类型(如对象、列表等)转换为字符串进行存储。
1.3 SharedPreferences 存储方式
1.3.1 文件存储
- SharedPreferences 存储的数据实际上是以文件形式存储在设备的本地存储中。
- 文件名为
package_name.xml,其中package_name是应用的包名。
1.3.2 数据格式
- SharedPreferences 的数据格式为 XML,便于阅读和理解。
- 数据以键值对的形式存储,键为字符串类型,值为基本数据类型或字符串数组。
1.4 SharedPreferences 安全性
- SharedPreferences 存储的数据是明文形式,不加密,存在一定的安全风险。
- 在实际应用中,应尽量避免存储敏感信息,如密码、用户隐私等。
2. SharedPreferences 基本用法
2.1 获取 SharedPreferences 实例
2.1.1 方式一:通过 Context 获取
getSharedPreferences(String name, int mode)- 参数一:SharedPreferences 文件名,如果不指定,默认名为
"default"。 - 参数二:文件读写模式,如 Context.MODE_PRIVATE、Context.MODE_APPEND 等。
2.1.2 方式二:通过 Bundle 获取
getSharedPreferences(String name, int mode)- 参数同上。
2.2 存储数据
2.2.1 存储基本数据类型
Editor edit = sp.edit();edit.putString("key", "value");edit.putInt("key", value);edit.putFloat("key", value);edit.putLong("key", value);edit.putBoolean("key", value);edit.commit();
2.2.2 存储复杂数据类型
- 将复杂数据类型转换为字符串进行存储。
edit.putString("key", jsonString);
2.3 读取数据
2.3.1 读取基本数据类型
String value = sp.getString("key", "defaultValue");int value = sp.getInt("key", defaultValue);float value = sp.getFloat("key", defaultValue);long value = sp.getLong("key", defaultValue);boolean value = sp.getBoolean("key", defaultValue);
2.3.2 读取复杂数据类型
- 将字符串转换为对应的数据类型。
JSONObject jsonObject = new JSONObject(sp.getString("key", ""));
2.4 删除数据
Editor edit = sp.edit();edit.remove("key");edit.commit();
2.5 清除所有数据
Editor edit = sp.edit();edit.clear();edit.commit();
3. SharedPreferences 进阶用法
3.1 监听数据变化
SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { // 数据变化时的操作 } };sp.registerOnSharedPreferenceChangeListener(listener);sp.unregisterOnSharedPreferenceChangeListener(listener);
3.2 获取默认共享偏好设置
SharedPreferences getDefaultSharedPreferences(Context context)
3.3 获取编辑器实例
Editor edit = sp.edit();
3.4 获取文件路径
String filePath = sp.getFile().getAbsolutePath();
3.5 获取编辑器类型
int getMode();
4. SharedPreferences 注意事项
4.1 跨进程通信
- SharedPreferences 支持跨进程通信,但需要注意数据的安全性和同步问题。
- 在多进程环境下,应使用
Context.MODE_MULTI_PROCESS模式进行数据存储。
4.2 数据同步
- SharedPreferences 默认情况下不会自动进行数据同步,如需同步,应手动调用
commit()方法。 - 在多线程环境下,应使用
apply()方法进行数据提交,避免主线程阻塞。
4.3 数据存储大小限制
- SharedPreferences 文件的大小有限制,默认大小为 1 MB。
- 如果存储的数据过大,可能会导致文件写入失败。
4.4 数据存储性能
- SharedPreferences 读写速度较快,但存储容量有限。
- 对于大量数据的存储,应考虑使用其他存储方案,如数据库、文件存储等。
5. SharedPreferences 替代方案
5.1 使用文件存储
- 直接使用文件存储,如 JSON、XML 等格式。
- 优点:存储容量大,灵活性强。
- 缺点:需要手动进行数据解析和序列化。
5.2 使用数据库
- 如 SQLite、Room 等数据库。
- 优点:支持复杂查询,存储容量大。
- 缺点:初始化成本较高,读写速度相对较慢。
5.3 使用轻量级数据库
- 如 Realm、GreenDao 等。
- 优点:轻量级,易用性强。
- 缺点:功能相对有限,可能存在一定的兼容性问题。
5.4 使用网络存储
- 如 HTTP 缓存、云存储等。
- 优点:存储容量大,易于实现数据同步。
- 缺点:依赖于网络环境,可能存在安全风险。




