文档章节

简单适用的SharedPreferences 工具类

最咸的咸鱼
 最咸的咸鱼
发布于 2017/07/06 23:45
字数 674
阅读 23
收藏 0
package net.nicolas.utils;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.text.TextUtils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StreamCorruptedException;

public final class SPUtils {
   
   private final static String name = "config";
   private final static int mode = Context.MODE_PRIVATE;
   
   /**
    * 保存首选项
    * @param context
    * @param key
    * @param value
    */
   public static void saveBoolean(Context context,String key,boolean value){
      SharedPreferences sp = context.getSharedPreferences(name, mode);
      Editor edit = sp.edit();
      edit.putBoolean(key, value);
      edit.commit();
   }
   public static void saveInt(Context context,String key,int value){
      SharedPreferences sp = context.getSharedPreferences(name, mode);
      Editor edit = sp.edit();
      edit.putInt(key, value);
      edit.commit();
   }
   public static void saveString(Context context,String key,String value){
      SharedPreferences sp = context.getSharedPreferences(name, mode);
      Editor edit = sp.edit();
      edit.putString(key, value);
      edit.commit();
   }
   
   
   /**
    * 获取首选项
    * @param context
    * @param key
    * @param defValue
    * @return
    */
   public static boolean getBoolean(Context context,String key,boolean defValue){
      SharedPreferences sp = context.getSharedPreferences(name, mode);
      return sp.getBoolean(key, defValue);
   }
   
   public static int getInt(Context context,String key,int defValue){
      SharedPreferences sp = context.getSharedPreferences(name, mode);
      return sp.getInt(key, defValue);
   }
   
   public static String getString(Context context,String key,String defValue){
      SharedPreferences sp = context.getSharedPreferences(name, mode);
      return sp.getString(key, defValue);
   }
   /**
    * desc:将数组转为16进制
    *
    * @param bArray
    * @return modified:
    */
   private static String bytesToHexString(byte[] bArray) {
      if (bArray == null) {
         return null;
      }
      if (bArray.length == 0) {
         return "";
      }
      StringBuffer sb = new StringBuffer(bArray.length);
      String sTemp;
      for (int i = 0; i < bArray.length; i++) {
         sTemp = Integer.toHexString(0xFF & bArray[i]);
         if (sTemp.length() < 2)
            sb.append(0);
         sb.append(sTemp.toUpperCase());
      }
      return sb.toString();
   }
   /**
    * desc:保存对象
    *
    * @param context
    * @param key
    * @param obj
    *            要保存的对象,只能保存实现了serializable的对象 modified:
    */
   public static void saveObject(Context context, String key, Object obj) {
      try {
         // 保存对象
         SharedPreferences.Editor sharedata = context.getSharedPreferences("user", Context.MODE_PRIVATE).edit();
         // 先将序列化结果写到byte缓存中,其实就分配一个内存空间
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         ObjectOutputStream os = new ObjectOutputStream(bos);
         // 将对象序列化写入byte缓存
         os.writeObject(obj);
         // 将序列化的数据转为16进制保存
         String bytesToHexString = bytesToHexString(bos.toByteArray());
         // 保存该16进制数组
         sharedata.putString(key, bytesToHexString);
         sharedata.commit();
      } catch (IOException e) {
         e.printStackTrace();
         //Log.e("", "保存obj失败");
      }
   }
   /**
    * desc:将16进制的数据转为数组
    *
    * @param data
    * @return modified:
    */
   private static byte[] StringToBytes(String data) {
      String hexString = data.toUpperCase().trim();
      if (hexString.length() % 2 != 0) {
         return null;
      }
      byte[] retData = new byte[hexString.length() / 2];
      for (int i = 0; i < hexString.length(); i++) {
         int int_ch; // 两位16进制数转化后的10进制数
         char hex_char1 = hexString.charAt(i); // 两位16进制数中的第一位(高位*16)
         int int_ch1;
         if (hex_char1 >= '0' && hex_char1 <= '9')
            int_ch1 = (hex_char1 - 48) * 16; // // 0 的Ascll - 48
         else if (hex_char1 >= 'A' && hex_char1 <= 'F')
            int_ch1 = (hex_char1 - 55) * 16; // // A 的Ascll - 65
         else
            return null;
         i++;
         char hex_char2 = hexString.charAt(i); // /两位16进制数中的第二位(低位)
         int int_ch2;
         if (hex_char2 >= '0' && hex_char2 <= '9')
            int_ch2 = (hex_char2 - 48); // // 0 的Ascll - 48
         else if (hex_char2 >= 'A' && hex_char2 <= 'F')
            int_ch2 = hex_char2 - 55; // // A 的Ascll - 65
         else
            return null;
         int_ch = int_ch1 + int_ch2;
         retData[i / 2] = (byte) int_ch;// 将转化后的数放入Byte里
      }
      return retData;
   }

   /**
    * desc:获取保存的Object对象
    *
    * @param context
    * @param key
    * @return modified:
    */
   public static Object getObject(Context context, String key) {
      try {
         SharedPreferences sharedata = context.getSharedPreferences("user", Context.MODE_PRIVATE);
         if (sharedata.contains(key)) {
            String string = sharedata.getString(key, "");
            if (TextUtils.isEmpty(string)) {
               return null;
            } else {
               // 将16进制的数据转为数组,准备反序列化
               byte[] stringToBytes = StringToBytes(string);
               ByteArrayInputStream bis = new ByteArrayInputStream(stringToBytes);
               ObjectInputStream is = new ObjectInputStream(bis);
               // 返回反序列化得到的对象
               Object readObject = is.readObject();
               return readObject;
            }
         }
      } catch (StreamCorruptedException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      } catch (ClassNotFoundException e) {
         e.printStackTrace();
      }
      // 所有异常返回null
      return null;
   }

}

© 著作权归作者所有

共有 人打赏支持
最咸的咸鱼
粉丝 1
博文 3
码字总数 2366
作品 0
武汉
程序员
[Android] SharedPreferences工具类

我们平常保存一些数据,都会用到SharedPreferences,他是保存在手机里面的,具体路径是data/data/你的包名/shared_prefs/保存的文件名.xml, SharedPreferences的使用也很简单,我自己就写了一...

枫兮兮
2014/02/27
0
0
SharePreference原理及跨进程数据共享的问题

SharedPreferences是Android提供的数据持久化的一种手段,适合单进程、小批量的数据存储与访问。为什么这么说呢?因为SharedPreferences的实现是基于单个xml文件实现的,并且,所有持久化数据...

看书的小蜗牛
2017/11/15
0
0
Android之SharedPreferences两个工具类

相信Android的这个最简单的存储方式大家都很熟悉了,但是有一个小小技巧,也许你没有用过,今天就跟大家分享一下,我们可以把SharedPreferences封装在一个工具类中,当我们需要写数据和读数据...

postdep
2014/11/27
0
0
Android中SharedPreferences用法

1.SharedPreferences简介 为了保存软件的设置参数,Android 平台为我们提供了一个SharedPreferences 类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences 保存...

ForingY
2016/07/22
3
0
Android_6.数据存储2_SharedPreferences存储

本文是以Android Studio为开发工具,<> 为学习指导书籍的学习记录 6.3 SharedPreferences存储 1、不同于文件的存储方式,SharedPreferences是使用“==键值对==“的方式来存储数据的。即、当你...

橄榄工作室
05/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

发生系统错误 5 拒绝访问

1、使用命令net start *开启一个服务的时候,出现发生系统错误5,拒绝访问。 解决:切换到管理员模式执行此命令即可。

fang_faye
12分钟前
0
0
devops 成长路线

https://36kr.com/p/5157249.html

swingcoder
24分钟前
0
0
Java内存区域的划分和异常

行时数据区域 JVM在运行Java程序时候会将内存划分为若干个不同的数据区域。 程序计数器 线程私有。可看作是当前线程所执行的字节码的行号指示器,字节码解释器的工作是通过改变这个计数值来读...

架构师springboot
26分钟前
0
0
kubeadm 安装kubernetes1.12.1

准备环境 服务器 服务器情况: IP 系统版本 角色 Hostname 10.20.13.24 Centos7 64位 minimal master kuber24 10.20.13.25 Centos7 64位 minimal work Kuber25 10.20.13.26 Centos7 64位 mi......

hgfgoodcreate
29分钟前
3
0
腾讯又添 AI 开源项目! 腾讯 AI Lab 正式开源业内最大规模多标签图像数据集

2018年10月17日,腾讯AI Lab宣布正式开源“Tencent ML-Images”项目,地址为https://github.com/Tencent/tencent-ml-images。该项目由多标签图像数据集ML-Images,以及业内目前同类深度学习模...

腾讯开源
35分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部