展开说说: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. 在实际开发者很多会涉及敏感数据,针对敏感数据我们呢需要对其加密后再进行存储,取数据也是先解密再使用。
相关推荐
千里马学框架2 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台2 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone2 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc2 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo3 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077003 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼3 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone3 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen3 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone3 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui