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里面内存优化
android
jiet_h2 小时前
深入解析Kapt —— Kotlin Annotation Processing Tool 技术博客
android·开发语言·kotlin
alexhilton3 小时前
实战:探索Jetpack Compose中的SearchBar
android·kotlin·android jetpack
uhakadotcom3 小时前
EventBus:简化组件间通信的利器
android·java·github
笑鸿的学习笔记4 小时前
ROS2笔记之服务通信和基于参数的服务通信区别
android·笔记·microsoft
8931519605 小时前
Android开发融云获取多个会话的总未读数
android·android开发·android教程·融云获取多个会话的总未读数·融云未读数
zjw_swun6 小时前
实现了一个uiautomator玩玩
android
pengyu6 小时前
系统化掌握Dart网络编程之Dio(二):责任链模式篇
android·flutter·dart
水w6 小时前
【Android Studio】如何卸载干净(详细步骤)
android·开发语言·android studio·activity
亦是远方6 小时前
2025华为软件精英挑战赛2600w思路分享
android·java·华为