SharedPreferences 用法详解
SharedPreferences
是Android
平台给我们提供的一个轻量级的存储类,使用非常简单,能够轻松的存储数据和读取数据,特别适合用于保存软件配置参数。SharedPreferences只能保存简单类型的数据,例如:String
、int
等。一般会将复杂类型的数据转换成Base64
编码,以字符串的形式保存。SharedPreferences
背后是用xml
文件存放数据,文件存放在/data/data/<package name>/shared_prefs
目录下。
使用SharedPreferences
保存key-value
对的步骤如下:
- 使用
Activity
类的getSharedPreferences
方法获得SharedPreferences
对象,其中存储key-value
的文件名由getSharedPreferences
方法的第一个参数指定。 - 使用
SharedPreferences
接口的edit
获得SharedPreferences.Editor
对象。 - 通过
SharedPreferences.Editor
接口的putXxx
方法保存key-value
对,其中Xxx
表示不同的数据类型。例如:字符串类型的value
需要用putString
方法。 - 通过
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.Editor
有 apply
和 commit
两个方法用于提交数据编辑,这两个方法的区别在于:
-
apply
没有返回值而commit
返回boolean
表明修改是否提交成功 -
apply
是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘, 而commit
是同步的提交到硬件磁盘,因此,在多个并发的提交commit
的时候,他们会等待正在处理的commit
保存到磁盘后在操作,从而降低了效率。而apply
只是原子的提交到内容,后面有调用apply
的函数的将会直接覆盖前面的内存数据,这样从一定程度上提高了很多效率。 -
apply
方法不会提示任何失败的提示。
由于在一个进程中,sharedPreference
是单实例,一般不会出现并发冲突,如果对提交的结果不关心的话,建议使用apply
,当然需要确保提交成功且有后续操作的话,还是需要用commit
的。