展开说说:Android之SharedPreferences

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方法不用,下面距离分别验证这些方法。另外下面还有个是检查当前键是否存在 可以返回所有可用的键值 两个方法。

  1. 布局定义了一些按钮
  1. 定义 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 当下 首选方法。

  1. 定义按钮的点击事件并调用这个工具类
复制代码
   @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");
       }
   }
  1. 一些小提醒
    1. 应用程序一旦卸载或者通过手机设置页面清缓存,SharedPreference也会被删除。
    2. 在实际开发者很多会涉及敏感数据,针对敏感数据我们呢需要对其加密后再进行存储,取数据也是先解密再使用。
相关推荐
CYRUS_STUDIO6 分钟前
利用 Linux 信号机制(SIGTRAP)实现 Android 下的反调试
android·安全·逆向
CYRUS_STUDIO25 分钟前
Android 反调试攻防实战:多重检测手段解析与内核级绕过方案
android·操作系统·逆向
黄林晴4 小时前
如何判断手机是否是纯血鸿蒙系统
android
火柴就是我4 小时前
flutter 之真手势冲突处理
android·flutter
法的空间5 小时前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
循环不息优化不止5 小时前
深入解析安卓 Handle 机制
android
恋猫de小郭5 小时前
Android 将强制应用使用主题图标,你怎么看?
android·前端·flutter
jctech5 小时前
这才是2025年的插件化!ComboLite 2.0:为Compose开发者带来极致“爽”感
android·开源
用户2018792831675 小时前
为何Handler的postDelayed不适合精准定时任务?
android
叽哥5 小时前
Kotlin学习第 8 课:Kotlin 进阶特性:简化代码与提升效率
android·java·kotlin