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 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo2 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077002 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼2 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone2 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen2 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone2 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui