c
import android.content.Context;
import android.content.SharedPreferences;
import java.util.List;
import java.util.Set;
import java.util.HashSet;
import java.util.ArrayList;
public class SharedPreferencesUtils {
private static final String PREFERENCE_NAME = "app_preferences"; // 设定 SharedPreferences 名称
private static SharedPreferencesUtils instance;
private SharedPreferences sharedPreferences;
private SharedPreferences.Editor editor;
// 构造函数是私有的,防止外部创建实例
private SharedPreferencesUtils(Context context) {
this.sharedPreferences = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
this.editor = sharedPreferences.edit();
}
// 获取单例实例
public static synchronized SharedPreferencesUtils getInstance(Context context) {
if (instance == null) {
instance = new SharedPreferencesUtils(context.getApplicationContext()); // 使用 applicationContext 避免内存泄漏
}
return instance;
}
// 保存字符串
public void putString(String key, String value) {
editor.putString(key, value);
editor.apply();
}
// 获取字符串
public String getString(String key, String defaultValue) {
return sharedPreferences.getString(key, defaultValue);
}
// 保存整数
public void putInt(String key, int value) {
editor.putInt(key, value);
editor.apply();
}
// 获取整数
public int getInt(String key, int defaultValue) {
return sharedPreferences.getInt(key, defaultValue);
}
// 保存布尔值
public void putBoolean(String key, boolean value) {
editor.putBoolean(key, value);
editor.apply();
}
// 获取布尔值
public boolean getBoolean(String key, boolean defaultValue) {
return sharedPreferences.getBoolean(key, defaultValue);
}
// 保存浮动数值
public void putFloat(String key, float value) {
editor.putFloat(key, value);
editor.apply();
}
// 获取浮动数值
public float getFloat(String key, float defaultValue) {
return sharedPreferences.getFloat(key, defaultValue);
}
// 保存长整型值
public void putLong(String key, long value) {
editor.putLong(key, value);
editor.apply();
}
// 获取长整型值
public long getLong(String key, long defaultValue) {
return sharedPreferences.getLong(key, defaultValue);
}
// 保存字符串集合
public void putStringSet(String key, Set<String> values) {
editor.putStringSet(key, values);
editor.apply();
}
// 获取字符串集合
public Set<String> getStringSet(String key, Set<String> defaultValue) {
return sharedPreferences.getStringSet(key, defaultValue);
}
// 保存列表
public void putStringList(String key, List<String> list) {
Set<String> set = new HashSet<>(list); // 转换为Set存储
editor.putStringSet(key, set);
editor.apply();
}
// 获取列表
public List<String> getStringList(String key, List<String> defaultValue) {
Set<String> set = sharedPreferences.getStringSet(key, new HashSet<>());
return set.isEmpty() ? defaultValue : new ArrayList<>(set);
}
// 删除某个键
public void remove(String key) {
editor.remove(key);
editor.apply();
}
// 清除所有数据
public void clear() {
editor.clear();
editor.apply();
}
// 判断某个键是否存在
public boolean contains(String key) {
return sharedPreferences.contains(key);
}
}
- 解释说明
单例模式 (getInstance): 使用了 synchronized 关键字确保多线程环境下只有一个实例被创建。getInstance 方法在第一次调用时初始化 SharedPreferencesUtils 实例,并且使用 context.getApplicationContext() 来避免内存泄漏。getApplicationContext() 能够保证应用在整个生命周期中只存在一个 Context 实例。
私有构造方法: 将构造方法设为私有,确保外部无法直接通过 new 来创建 SharedPreferencesUtils 实例,只能通过 getInstance 方法获取。
SharedPreferences 的操作: 这个类封装了所有常用的 SharedPreferences 操作,如保存和获取字符串、整数、布尔值、列表等。
- 使用示例
c
// 获取 SharedPreferencesUtils 单例实例
SharedPreferencesUtils spUtils = SharedPreferencesUtils.getInstance(context);
// 保存数据
spUtils.putString("username", "JohnDoe");
spUtils.putInt("age", 30);
spUtils.putBoolean("isUserLoggedIn", true);
// 获取数据
String username = spUtils.getString("username", "default");
int age = spUtils.getInt("age", 0);
boolean isLoggedIn = spUtils.getBoolean("isUserLoggedIn", false);
// 保存列表
List<String> hobbies = new ArrayList<>();
hobbies.add("Reading");
hobbies.add("Swimming");
spUtils.putStringList("hobbies", hobbies);
// 获取列表
List<String> savedHobbies = spUtils.getStringList("hobbies", new ArrayList<>());
- 优点
单例模式: 保证应用中 SharedPreferences 只有一个实例,避免多次实例化带来的性能问题。
线程安全: 使用 synchronized 保证多线程环境下的安全。
高效: SharedPreferences 的操作是异步的,使用 apply() 方法进行数据保存。
简洁: 封装了常用的数据类型的存储和读取,使用起来更加简洁和高效。
通过这种方式,你可以方便地在应用中任何地方访问和修改 SharedPreferences 数据,并且确保整个应用的设置数据是统一和安全的。