SharedPreferences 是一种轻量级的数据持久化存储机制。以key/value键值对形式存储在xml文件,用于保存一些应用程序数据。保存在 /data/data/PACKAGE_NAME/shared_prefs/xxx.Xml文件。
SharedPreferences 只能存储string,int,float,long和boolean五个基本数据类型。如果需要存取比较复杂的数据类型,则需要对这些数据进行序列化。这一点通过源码可以看到SharedPreferences是个接口它的内部接口是Editor,里面定义了上面五个数据类型的put方法,以及putString、remove、clear、commit、apply方法。
上面可以看出getxx方法不在Edit接口中,他们是在SharedPreferences
父级接口定义的,因此增加、删除、清空方法需要使用edit但get方法不用,下面距离分别验证这些方法。另外下面还有个是检查当前键是否存在和可以返回所有可用的键值两个方法。
- 布局定义了一些按钮
- 定义getSharedPreferences工具类
-
private static SharedPreferences preferences; public static final String SPNAME = "appSpName"; public static void putString(String key,String value){ getSP().edit().putString(key,value).apply(); Log.e(TAG, "putString: "+ getString(key,"你太着急了")); } public static String getString(String key,String defaultValue){ return getSP().getString(key, defaultValue); } public static void putInt(String key,int value){ getSP().edit().putInt(key,value).apply(); } public static int getInt(String key,int defaultValue){ return getSP().getInt(key, defaultValue); } public static void putBoolean(String key,boolean value){ getSP().edit().putBoolean(key,value).apply(); } public static boolean getBoolean(String key,boolean defaultValue){ return getSP().getBoolean(key, defaultValue); } public static void putFloat(String key,float value){ getSP().edit().putFloat(key,value).apply(); } public static float getFloat(String key,float defaultValue){ return getSP().getFloat(key, defaultValue); } public static void putLong(String key,long value){ getSP().edit().putLong(key,value).apply(); } public static long getLong(String key,long defaultValue){ return getSP().getLong(key, defaultValue); } /** * 根据key值删除指定元素,各类型通用因为大家的key都是String * @param key */ public static void deleteValue(String key){ getSP().edit().remove(key).apply(); } /** * 清空了,创建这个sharedpreference所有的 */ public static void clearAll(){ getSP().edit().clear().apply(); } /** * 清空了,创建这个sharedpreference所有的 */ public static boolean containsKey(String key){ getSP().edit().clear().apply(); //检查当前键是否存在 boolean isContains=getSP().contains(key); Log.e(TAG, "containsKey: isContains= "+isContains ); //使用getAll可以返回所有可用的键值 Map<String,?> keyMap=getSP().getAll(); if (!keyMap.isEmpty()){ Set<String> keySet = keyMap.keySet(); for (String myKey: keySet){ Log.e(TAG, "containsKey: myKey= "+myKey ); } } return isContains; } public static SharedPreferences getSP(){ if (preferences == null){ preferences = BaseApplication.getContext().getSharedPreferences(SPNAME, Context.MODE_PRIVATE); } return preferences; }
注意:
2.1 BaseApplication.getContext().getSharedPreferences(SPNAME, Context.MODE_PRIVATE);
getSharedPreferences方法传入的操作模式
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
特别注意:还有两个MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE我们不需要学习了,他们 用来控制其他应用是否有权限读写该文件,在Android 4.2版本中已经被弃用2.2 apply和commit前者是异步后者是同步方法。apply方法时在Android API level 9中引入的,调用它会安全的异步写入SharedPreference Editor,是当下首选方法。
- 定义按钮的点击事件并调用这个工具类
-
@Override public void onClick(View v) { int clickId = v.getId(); if (clickId == R.id.asyncAct_putString){ SpUtil.putString("name","张三"); }else if (clickId == R.id.asyncAct_getString){ String name = SpUtil.getString("name", "无名"); String name1 = SpUtil.getString("name1", "无名"); Log.e(TAG, "getString: name= "+ name +" name1= "+name1); }else if (clickId == R.id.asyncAct_putBoolean){ SpUtil.putBoolean("isBoy",true); }else if (clickId == R.id.asyncAct_getBoolean){ boolean isBoy = SpUtil.getBoolean("isBoy", false); Log.e(TAG, "getBoolean: isBoy= "+isBoy); }else if (clickId == R.id.asyncAct_putInt){ SpUtil.putInt("age",18); }else if (clickId == R.id.asyncAct_getInt){ int age = SpUtil.getInt("age", -1); Log.e(TAG, "getInt: age= "+age); }else if (clickId == R.id.asyncAct_putFloat){ SpUtil.putFloat("height",177.7F); }else if (clickId == R.id.asyncAct_getFloat){ float height = SpUtil.getFloat("height", 0.00F); Log.e(TAG, "getFloat: height= "+height ); }else if (clickId == R.id.asyncAct_putLong){ SpUtil.putLong("weight",70L); }else if (clickId == R.id.asyncAct_getLong){ long weight = SpUtil.getLong("weight", 0L); Log.e(TAG, "getLong: weight= "+weight ); }else if (clickId == R.id.asyncAct_clearAll){ SpUtil.clearAll(); } else if (clickId == R.id.asyncAct_containsKey){ SpUtil.containsKey("weight"); } }
- 一些小提醒
- 应用程序一旦卸载或者通过手机设置页面清缓存,SharedPreference也会被删除。
- 在实际开发者很多会涉及敏感数据,针对敏感数据我们呢需要对其加密后再进行存储,取数据也是先解密再使用。