Android自己搭建一个实用的SharedPreferences管理类
前言
在項目中經常會用到SharedPreferences來存儲一些配置信息,比如用戶的賬號信息等。但是當項目大了之后如果還在要使用時再單獨創建和使用SharedPreferences就會造成SharedPreferences泛濫,不好管理,代碼可維護性差。因此結合實際的項目經驗給出一個通用的SharedPreferences管理類,把項目中所有使用到的SharedPreferences統一管理,同時簡化SharedPreferences的使用流程。
SharedPreferences簡介
1、原理 SharedPreferences使用xml格式為Android應用提供一種永久的數據存貯方式,并且是使用鍵值對的方式來存儲數據的。對于一個Android應用,它存貯在文件系統的/data/data/app_package_name/shared_prefs/目錄下,可以被處在同一個應用中的所有Activity 訪問。 因為SharedPreferences本身是一個接口,程序無法直接創建SharedPreferences的實例,只能通過Context提供的
getSharedPreferences(String name,int mode) 復制代碼方法來獲取SharedPreferences的實例:
public abstract SharedPreferences getSharedPreferences(String name,int mode) 復制代碼此方法接收兩個參數,第一個參數用于指定SharedPreferences文件的名稱(格式為xml文件),如果指定的文件不存在則會創建一個。第二個參數用于指定操作模式: MODE_PRIVATE:默認操作模式,和直接傳0效果相同,表示只有當前應用程序才可以對這個SharedPreferences文件進行讀寫 MODE_WORLD_READABLE:指定此SharedPreferences對其他程序只讀且無法修改。 MODE_WORLD_WRITEABLE:指定此SharedPreferences能被其他程序讀寫。
2、實例
SharedPreferences 的使用也很簡單,主要分為三步,1、獲取SharedPreferences 的實例2、通過Editor 往SharedPreferences 中存數據。3、獲取SharedPreferences 中的數據。
//1 private SharedPreferences sp=context.getApplicationContext().getSharedPreferences(name, Context.MODE_PRIVATE); //獲取SharedPreferences實例//2Editor editor = sp.edit();editor.putString("msg", "hello world");editor.commit(); //通過editor存儲數據//3sp.getString("msg", ""); //獲取存儲的數據 復制代碼SharedPreferences管理類實現
由上面SharedPreferences的用法可知,每一個SharedPreferences都有一個名字,SharedPreferences里面存的內容是通過key-value形式的。要把項目中所有的SharedPreferences管理起來,又可以通過名字獲取相應的SharedPreferences,可以通過HashMap作為數據結構來存儲SharedPreferences。如下圖:
但是如果在HashMap中只存儲SharedPreferences那么獲取到SharedPreferences后又要進行各種讀寫操作,所以可以考慮把這些操作和SharedPreferences封裝在一起放到hashMap中保存。如下圖:使用HashMap來存儲項目中用到的所有SharedPreferences的封裝類,并且通過SharedPreferences的名稱來查找和操作。 定義一個SharedPreferencesManager類。 1、類變量
public class SharedPreferencesManager {private static final String DEFAULT_SHARED_PREFERENCE = "DEFAULT_SHARED_PREFERENCE";//默認名稱private static HashMap<String, SharedPreferencesManager> preferenceManagerHashMap = new HashMap<>();//存儲項目中的SharedPreferences。private SharedPreferences sharedPreference;private SharedPreferences.Editor editor;//和當前SharedPreferences相關,用于操作SharedPreferences數據...... } 復制代碼在SharedPreferencesManager中定義了DEFAULT_SHARED_PREFERENCE用于表示未命名的默認的SharedPreferences,preferenceManagerHashMap 用來存儲項目中使用到的SharedPreferences封裝類SharedPreferencesManager,并且可以通過SharedPreferences名字查找到。
2、生成SharedPreferences封裝類SharedPreferencesManager并存到HashMap中
private static SharedPreferencesManager getSharedPreferenceManager(Context context, String sharedPreferenceName) {if (preferenceManagerHashMap == null) preferenceManagerHashMap = new HashMap<>();// 如果preferenceManagerHashMap 為null就新建一個String name = TextUtils.isEmpty(sharedPreferenceName) ? DEFAULT_SHARED_PREFERENCE : sharedPreferenceName;SharedPreferencesManager sharedPreferencesManager = preferenceManagerHashMap.get(name);if (sharedPreferencesManager == null) {sharedPreferencesManager = new SharedPreferencesManager(context, name);preferenceManagerHashMap.put(name, sharedPreferencesManager);}return sharedPreferencesManager;} 復制代碼getSharedPreferenceManager中通過判斷當前name是否存在對應的sharedPreferencesManager如果沒有就生成一個sharedPreferencesManager并且存放到preferenceManagerHashMap中。
3、sharedPreferencesManager的構造函數
private SharedPreferencesManager(Context context, String name) {sharedPreference = context.getApplicationContext().getSharedPreferences(name, Context.MODE_PRIVATE);//獲取sharedPreference editor = sharedPreference.edit();//生成editor } 復制代碼在sharedPreferencesManager的構造函數中生成了sharedPreference和editor用于操作數據。
4、存放數據和讀取數據 存放數據,通過構造方法里面生成的editor來進行數據的存放,putValue里面做了類型判斷。
public SharedPreferencesManager putValue(String key, Object value) {if (value instanceof Integer) {editor.putInt(key, (Integer) value);} else if (value instanceof Boolean) {editor.putBoolean(key, (Boolean) value);} else if (value instanceof Float) {editor.putFloat(key, (Float) value);} else if (value instanceof String) {editor.putString(key, (String) value);} else if (value instanceof Long) {editor.putLong(key, (Long) value);} else {String json = gson.toJson(value);editor.putString(key, json);}editor.commit();return this;} 復制代碼讀取數據
public <T> T getValue(String key, Class<T> type) {if (type == Integer.class) {Integer value = sharedPreference.getInt(key, 0);return (T) value;} else if (type == Boolean.class) {Boolean value = sharedPreference.getBoolean(key, false);return (T) value;} else if (type == Float.class) {Float value = sharedPreference.getFloat(key, 0);return (T) value;} else if (type == String.class) {String value = sharedPreference.getString(key, "");return (T) value;} else if (type == Long.class) {Long value = sharedPreference.getLong(key, 0);return (T) value;} else {String json = sharedPreference.getString(key, "");if (TextUtils.isEmpty(json)) {return null;} else {T value = gson.fromJson(json, type);return value;}}} 復制代碼5、SharedPreferencesManager初始化
前面已經定義了方法數據和讀取數據的方法,下面給SharedPreferencesManager初始化,初始化一次生成項目中要用到的所有SharedPreferences實例。
public static synchronized void init(Context context, boolean createDefaultPreference, String... names) {if (createDefaultPreference) {getSharedPreferenceManager(context, DEFAULT_SHARED_PREFERENCE);}if (names == null || names.length == 0) return;for (String name : names) {getSharedPreferenceManager(context, name);}} 復制代碼createDefaultPreference表示是否生成默認的SharedPreference,names表示項目中要生成的SharedPreferences的名稱。 6、獲取SharedPreferencesManager實例 使用單例模式來生成SharedPreferencesManager的實例
//根據name返回實例 public static synchronized SharedPreferencesManager getInstance(String name) {SharedPreferencesManager sharedPreferencesManager = preferenceManagerHashMap.get(name);if (sharedPreferencesManager == null)throw new IllegalStateException("The share preference: " + name + " is not initialized before. You have to initialize it first by calling init(Context, boolean, String...) function");return sharedPreferencesManager;}/*** 返回默認的SharedPreferencesManager 實例: {@link #DEFAULT_SHARED_PREFERENCE}** @return*/public static synchronized SharedPreferencesManager getInstance() {SharedPreferencesManager sharedPreferencesManager = preferenceManagerHashMap.get(DEFAULT_SHARED_PREFERENCE);if (sharedPreferencesManager == null)throw new IllegalStateException("The default share preference is not initialized before. You have to initialize it first by calling init(Context, boolean, String...) function");return sharedPreferencesManager;} 復制代碼總結
有了SharedPreferencesManager類之后,就可以在項目中先使用init()方法初始化所有的SharedPreferences,然后調用實例,就可以直接簡單的操作了。源碼地址:源碼地址
總結
以上是生活随笔為你收集整理的Android自己搭建一个实用的SharedPreferences管理类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于部署传统的Dynamic Web项目
- 下一篇: 水文-接口和抽象类有什么不同