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 操作,如保存和获取字符串、整数、布尔值、列表等。
- 使用示例
// 获取 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 数据,并且确保整个应用的设置数据是统一和安全的。