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 数据,并且确保整个应用的设置数据是统一和安全的。
相关推荐
每次的天空1 小时前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
恋猫de小郭2 小时前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
断剑重铸之日3 小时前
Android自定义相机开发(类似OCR扫描相机)
android
随心最为安3 小时前
Android Library Maven 发布完整流程指南
android
岁月玲珑3 小时前
【使用Android Studio调试手机app时候手机老掉线问题】
android·ide·android studio
还鮟7 小时前
CTF Web的数组巧用
android
小蜜蜂嗡嗡8 小时前
Android Studio flutter项目运行、打包时间太长
android·flutter·android studio
aqi008 小时前
FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
android·ffmpeg·音视频·流媒体
zhangphil10 小时前
Android理解onTrimMemory中ComponentCallbacks2的内存警戒水位线值
android
你过来啊你10 小时前
Android View的绘制原理详解
android