Android本地存储SharedPreferences

1、SharedPreferences详解

1.1 什么是SharedPreferences

它是一个轻量级应用程序内部轻量级的存储方案,特别适合用于保存软件配置参数:比如,boolean,int , float ,long, String等数据。
使用SP保存数据,其实质是采用了xml文件存放数据,路径为:/data/data//shared_prefs;
程序卸载后也会一并清除,不会残留信息;

1.2 获取SharedPreferences的三种方式
  • 调用Context对象的getSharedPreferences()

调用Context对象的getSharedPreferences()方法获得的SharedPreferences对象可以被同一应用程序下的其他组件共享;

getSharedPreferences("sp_name", Context.MODE_PRIVATE)
  • 调用Activity对象的getPreferencrs()

调用Activity对象的getPreferences() 方法获得的SharedPreferences对象只能在该Activity中使用;

public SharedPreferences getPreferences(@Context.PreferencesMode int mode) {
    return getSharedPreferences(getLocalClassName(), mode);
}   
  • 通过PreferenceManager 的 getDefaultSharedPreferences()
public static SharedPreferences getDefaultSharedPreferences(Context context) {
    return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
            getDefaultSharedPreferencesMode());
}

public static String getDefaultSharedPreferencesName(Context context) {
    return context.getPackageName() + "_preferences";
}

private static int getDefaultSharedPreferencesMode() {
    return Context.MODE_PRIVATE;
}
1.3 SharedPreferences的四种操作模式
  • Context.MODE_PRIVATE

为默认操作模式,代表该文件是私有数据,只能被应用本身访问,写入的内容会覆盖原文件的内容;

  • Context.MODE_APPEND

模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件;

  • Context.MODE_WORLD_READABLE

用来控制其他应用是否有权限读该文件,表示当前文件可以被其他应用读取;

  • Context.MODE_WORLD_WRITEABLE

用来控制其他应用是否有权限写该文件,表示当前文件可以被其他应用写入;

1.4 SharedPreferences的使用
  • SharedPreferences存数据
//获得SharedPreferences的实例,sp_name是文件名
 SharedPreferences sp = getSharedPreferences("sp_name", Context.MODE_PRIVATE);
 // 获得Editor实例
SharedPreferences.Editor editor = sp.edit();
String name = "lucy";
int age = 22;
//以key-value形式保存数据
editor.putString("name",name);
editor.putInt("age", age);
//apply()是异步写入数据
editor.apply();
//commit()是同步写入数据
editor.commit();
  • SharedPreferences取数据
//获得SharedPreferences的实例
SharedPreferences sp = getSharedPreferences("sp_name", Context.MODE_PRIVATE);
//通过key值获取到相应的data,如果没取到,则返回后面的默认值
String name = sp.getString("name",null);
int age = sp.getInt("age", 404);

2、SharedPreferences 源码解析结论

  • SharePreferences 读取xml文件时,会以DOM方式解析(把整个xml文件直接加载到内存中解析),在调用getxxx() 方法时取到的是内存中的数据,方法执行时会有个锁来阻塞,目的是等待文件加载完毕,没加载完成之前会wait();
  • SharedPreferences写文件时,如果调用commit(),会将数据同步写入内存中,内存数据更新,再同步写入磁盘中;如果调用apply(),会将数据同步写入内存中,内存数据更新,然后异步写入磁盘,也就是说可能写磁盘操作还没有完成就直接返回了。在主线程中建议使用apply(),因为同步写入磁盘,当文件较大时,commit()会等到写磁盘完成再返回,可能会有ANR(Application Not Responding)问题;
  • SharedPreferences第一次初始化到读取到数据存在一定延迟,因为需要到文件中读取数据,因此可能会对UI线程流畅造成一定影响;
2.1 commit() 和apply() 区别
  • commit() 和 apply() 这两个方法都是首先修改内存中缓存的mMap的值,然后将数据写到磁盘中。它们的主要区别是commit会等待写入磁盘后再返回,而apply则在调用写磁盘操作后就直接返回了,但是这时候可能磁盘中数据还没有被修改;
2.2 SharedPrefrences有什么优缺点
  • 优点

1、轻量级,以键值对的方式进行存储,使用方便,易于理解;
2、采用的是XML文件形式存储在本地,程序卸载后也会一并被清除,不会残留信息。

  • 缺点

1、当xml文件过大时,第一次加载初始化时,可能会引起卡顿;
2、当有磁盘写入操作时,当前Activity的onStop()方法会同步等待磁盘写入完成;故此时不能关闭此Activity或跳转。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值