android: SharedPreferences 用法详解
阅读原文时间:2021年04月20日阅读:1

SharedPreferencesAndroid平台给我们提供的一个轻量级的存储类,使用非常简单,能够轻松的存储数据和读取数据,特别适合用于保存软件配置参数。SharedPreferences只能保存简单类型的数据,例如:Stringint等。一般会将复杂类型的数据转换成Base64编码,以字符串的形式保存。SharedPreferences背后是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs目录下。
使用SharedPreferences保存key-value对的步骤如下:

  1. 使用Activity类的getSharedPreferences方法获得SharedPreferences对象,其中存储key-value的文件名由getSharedPreferences方法的第一个参数指定。
  2. 使用SharedPreferences接口的edit获得SharedPreferences.Editor对象。
  3. 通过SharedPreferences.Editor接口的putXxx方法保存key-value对,其中Xxx表示不同的数据类型。例如:字符串类型的value需要用putString方法。
  4. 通过SharedPreferences.Editor接口的commit方法保存key-value对,commit方法相当于数据库事务中的提交操作。

使用SharedPreferences保存key-value对的代码如下:

SharedPreferences sharedPreferences = getSharedPreferences("test", Context.MODE_PRIVATE);

Editor editor = sharedPreferences.edit();//获取编辑器

editor.putString("name", "小明");

editor.putInt("age", 24);

editor.commit();//提交修改

生成的test.xml文件内容如下:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
   <string name="name">小明</string>
   <int name="age" value="24" />
</map>

使用SharedPreferences读取数据代码如下:

SharedPreferences sharedPreferences= getSharedPreferences("test",   
Activity.MODE_PRIVATE);   
// 使用getString方法获得value,注意第2个参数是value的默认值   
String name =sharedPreferences.getString("name", "");   
int age =sharedPreferences.getInt("age", 0);   

SharedPreferences的四种操作模式:

Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
Context.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.
Context.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入.

使用SharedPreferences读取其他应用中的Preference
读取其他应用中的Preference的前提条件是:该preference创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE权限。
例如:有个<package name>com.xiuxiuing.test的应用使用下面语句创建了preference

getSharedPreferences("test", Context.MODE_WORLD_READABLE);

我们要访问上面应用的preference,首先需要创建上面应用的Context,然后通过Context 访问preference,访问preference时会在应用所在包下的shared_prefs目录找到preference ,代码如下:

Context context = createPackageContext("com.xiuxiuing.test", Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences sharedPreferences = context.getSharedPreferences("test", Context.MODE_WORLD_READABLE);
String name = sharedPreferences.getString("name", "");
int age = sharedPreferences.getInt("age", 0);

说明:
SharedPreferences.Editorapplycommit 两个方法用于提交数据编辑,这两个方法的区别在于:

  1. apply没有返回值而commit返回boolean表明修改是否提交成功

  2. apply是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘, 而commit是同步的提交到硬件磁盘,因此,在多个并发的提交commit的时候,他们会等待正在处理的commit保存到磁盘后在操作,从而降低了效率。而apply只是原子的提交到内容,后面有调用apply的函数的将会直接覆盖前面的内存数据,这样从一定程度上提高了很多效率。

  3. apply方法不会提示任何失败的提示。

由于在一个进程中,sharedPreference是单实例,一般不会出现并发冲突,如果对提交的结果不关心的话,建议使用apply,当然需要确保提交成功且有后续操作的话,还是需要用commit的。

作者:咻咻ing
链接:https://www.jianshu.com/p/13f26d68b02e
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。