Android 封装一个SharedPreferencesUtil

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);
    }
}
  1. 解释说明
    单例模式 (getInstance): 使用了 synchronized 关键字确保多线程环境下只有一个实例被创建。getInstance 方法在第一次调用时初始化 SharedPreferencesUtils 实例,并且使用 context.getApplicationContext() 来避免内存泄漏。getApplicationContext() 能够保证应用在整个生命周期中只存在一个 Context 实例。

私有构造方法: 将构造方法设为私有,确保外部无法直接通过 new 来创建 SharedPreferencesUtils 实例,只能通过 getInstance 方法获取。

SharedPreferences 的操作: 这个类封装了所有常用的 SharedPreferences 操作,如保存和获取字符串、整数、布尔值、列表等。

  1. 使用示例
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<>());
  1. 优点
    单例模式: 保证应用中 SharedPreferences 只有一个实例,避免多次实例化带来的性能问题。
    线程安全: 使用 synchronized 保证多线程环境下的安全。
    高效: SharedPreferences 的操作是异步的,使用 apply() 方法进行数据保存。
    简洁: 封装了常用的数据类型的存储和读取,使用起来更加简洁和高效。
    通过这种方式,你可以方便地在应用中任何地方访问和修改 SharedPreferences 数据,并且确保整个应用的设置数据是统一和安全的。
相关推荐
_小马快跑_41 分钟前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android
_小马快跑_42 分钟前
Kotlin | 从SparseArray、ArrayMap的set操作符看类型检查的不同
android
_小马快跑_44 分钟前
Android | 为什么有了ArrayMap还要再设计SparseArray?
android
_小马快跑_1 小时前
Android TextView图标对齐优化:使用LayerList精准控制drawable位置
android
_小马快跑_1 小时前
Kotlin协程并发控制:多线程环境下的顺序执行
android
_小马快跑_1 小时前
Kotlin协程异常捕获陷阱:try-catch捕获异常失败了?
android
_小马快跑_1 小时前
Android | 权限申请与前置说明弹窗同时展示的优雅方案
android
_小马快跑_1 小时前
Android | Channel 与 Flow的异同点
android
_小马快跑_1 小时前
Android | 文本测量:从 Paint.measureText 到 StaticLayout 的替换
android
树獭非懒2 小时前
告别繁琐多端开发:DivKit 带你玩转 Server-Driven UI!
android·前端·人工智能