SharedPreferences类是Android五大存储方式之一,它是Android提供的用来存储一些简单配置信息的一种机制。SharedPreferences类适用于少量数据存储,存储的数据格式为Java基本数据类型(布尔值,浮点值,整型值,长整型和字符串),以key-value键值对形式写在XML文件中并进行存储的数据。且在同一设备理论上能被不同应用下所有的activity都可以访问到该xml文件;
XML文件存储位置:XML文件存储在DDMS中的File Explorer中的/data/data/相应应用包名(package name)/shared_prefs/下,
谷歌官方对于SharedPreferences的介绍:SharedPreferences 类提供了一个通用框架,以便您能够保存和检索原始数据类型的永久性键值对。 您可以使用 SharedPreferences 来保存任何原始数据:布尔值、浮点值、整型值、长整型和字符串。 此数据将跨多个用户会话永久保留(即使您的应用已终止亦如此)。
1.1 getSharedPreferences方法
SharedPreferences本身是一个接口,程序无法直接创建SharedPreferences的实例,只能通过Context提供的getSharedPreferences(String name,int mode)方法来获取SharedPreferences的实例:
/**
* Retrieve and hold the contents of the preferences file 'name', returning
* a SharedPreferences through which you can retrieve and modify its
* values. Only one instance of the SharedPreferences object is returned
* to any callers for the same name, meaning they will see each other's
* edits as soon as they are made.
*
* @param name Desired preferences file. If a preferences file by this name
* does not exist, it will be created when you retrieve an
* editor (SharedPreferences.edit()) and then commit changes (Editor.commit()).
* @param mode Operating mode.
*
* @return The single {@link SharedPreferences} instance that can be used
* to retrieve and modify the preference values.
*
* @see #MODE_PRIVATE
*/
public abstract SharedPreferences getSharedPreferences(String name, @PreferencesMode int mode);
-name:第一个参数用于指定SharedPreferences文件的名称(格式为xml文件),如果该名称的文件不存在则会创建一个;
-mode:第二个参数用于指定操作的模式:
● MODE_PRIVATE:默认操作模式,只有本应用程序才可以对这个SharedPreferences文件进行读写。
● MODE_WORLD_READABLE:其他应用对这个SharedPreferences文件只能读不能修改。
● MODE_WORLD_WRITEABLE:这个SharedPreferences文件能被其他的应用读写。
● MODE_MULTI_PROCESS:这个模式在Android2.3之后已经弃之不用了,可以省略。
1.2 SharedPreferences.Editor对象
在使用SharedPreferences存储数据前需要了解一下SharedPreferences.Editor对象的一些主要方法:
SharedPreferences.Editor clear():删SharedPreferences中所有的数据。
SharedPreferences.Editor putXxx(String key , xxx value):
参数一:向SharedPreferences存入指定数据对应的key;
参数二:Java基本数据类型(布尔值,浮点值,整型值,长整型和字符串)。
SharedPreferences.Editor remove(): 删除SharedPreferences中指定key对应的数据项
boolean commit(): Editor编辑完成后,使用该方法提交修改。
viod apply();该方法在Editor编辑完成后,也可以使用该方法提交修改。
2.1 SharedPreferences获取对象
由于SharedPreferences本身是一个接口,程序无法直接创建SharedPreferences的实例,因此首先需要使用getSharedPreferences方法获取SharedPreferences对象,如下:
SharedPreferences share = getSharedPreferences("SHARE_NAME", MODE_PRIVATE);
2.2 SharedPreferences存储数据
SharedPreferences不能直接添加和修改数据,添加和修改数据需要通过SharedPreferences的Editor来完成,如下:
SharedPreferences share = getSharedPreferences("SHARE_NAME", MODE_PRIVATE);
SharedPreferences.Editor editor = share.edit();
editor.putXxx("key_name" , "value");
editor.commit();
2.3 同一应用SharedPreferences获取数据
SharedPreferences获取存储数据,无需在借用SharedPreferences.Editor来获取,可以直接SharedPreferences对象来获取数据,如下:
SharedPreferences share = getSharedPreferences("SHARE_NAME", MODE_PRIVATE);
String str = share.getString("key_name", "");//第二个参数是默认值,如果没有key_name对应的值,则返回默认值;
2.4 不同应用SharedPreferences获取数据
对应不同的SharedPreferences获取存储数据,首先需要保证的是在存储数据的模式不能是MODE_PRIVATE模式;
1、获取其他应用的Context对象;
Context otherAppContent = null;
try {
//设置我们要调用数据的应用包名
otherAppContent = createPackageContext("其他用包名(other-app-package-name)", CONTEXT_IGNORE_SECURITY);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
2、在根据Context对象获取其他应用的SharedPreferences对象;
SharedPreferences sharedPreferences = otherAppContent.getSharedPreferences("XML_NAME",MODE_WORLD_READABLE);
3、获取到对象后,面的存储和取数据都在同一应用方式一样;
● commit方法是有一个boolean的返回值
● 当数据变化进行存储时是一个原子性的操作
● 当两个editor对象同时对一个共享的preferences参数进行操作时,永远都是最后一个调用commit方法的editor变更了最后的数据值
● apply方法是没有返回值的
● apply的提交操作也是原子性的
● 当两个editor同时对preferences对象编辑时,也是最后一个调用apply方法的对象编辑数据
commit和apply方法的区别:
由于commit提交是同步过程,而apply是异步提交方式,所以从效率上来说commit提交会慢写;但是apply没有返回值,无法知道存储是否失败。如果不关心提交结果是否成功,因优先考虑apply方法。