做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库来存放并不划算,因为数据库连接跟操作等耗时大大影响了程序的效率,因此我们使用键值这种一一对应的关系来存放这些配置信息。SharedPreferences正是Android中用于实现这中存储方式的技术。
SharedPreferences的使用非常简单,能够轻松的存放数据和读取数据。SharedPreferences只能保存简单类型的数据,例如,String、int等。一般会将复杂类型的数据转换成Base64编码,然后将转换后的数据以字符串的形式保存在 XML文件中,再用SharedPreferences保存。
(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方法相当于数据库事务中的提交(commit)操作。
具体代码的书写流程为:
A、存放数据信息
1、打开Preferences,名称为setting,如果存在则打开它,否则创建新的Preferences
SharedPreferences settings = getSharedPreferences(“setting”, 0);
2、让setting处于编辑状态
SharedPreferences.Editor editor = settings.edit();
3、存放数据
editor.putString(“name”,”ATAAW”);
editor.putString(“URL”,”ATAAW.COM”);
4、完成提交
editor.commit();
B、读取数据信息
1、获取Preferences
SharedPreferences settings = getSharedPreferences(“setting”, 0);
2、取出数据
String name = settings.getString(“name”,”默认值”);
String url = setting.getString(“URL”,”default”);
以上就是Android中SharedPreferences的使用方法,其中创建的Preferences文件存放位置可以在Eclipse中查看:
DDMS->File Explorer /<package name>/shared_prefs/setting.xml
主要代码 具体如下(仅供参考):
在onCreate方法中调用restorePrefs()方法:
//读取 功能的实现
private void restorePrefs() {
// TODO Auto-generated method stub
//SharedPreferences是一种轻量级的数据存储方式.是以键值对来存储应用程序的
//配置信息的一种方式,它只能存储基本数据类型。
//声明一个优先级设置 类型 settings,载入配置文件
SharedPreferences settings = getPreferences(BMI.MODE_PRIVATE);
//使用getXXX函数从优先级设置读取不同类型的内容 得到优先级设置参数的内容
String pref_height = settings.getString(PREF_HEIGHT, "");
//此一句为唤醒记忆语句
field_height.setText(pref_height);
field_weight.requestFocus();//设置焦点字段 到“体重”字段上 用户只需直接输入体重数字就可以了
}
//存储 在Activity每次变暗,也就是离开当前屏幕时,记住设置的身高值 即 存储优先级设置
protected void onPause()
{
super.onPause();
Log.v("BMI", "onPause1");
//获得SharedPreferences对象
SharedPreferences settings = getPreferences(BMI.MODE_PRIVATE);
//获得SharedPreferences.Editor
SharedPreferences.Editor editor = settings.edit();
//保存组件的值 为优先级设置填写不同类型的内容
//用"field_height"界面组件标识符来取得身高的字符串 然后保存到PREF_HEIGHT所代表的优先级设置参数中
editor.putString(PREF_HEIGHT, field_height.getText().toString());
//提交保存的结果 将改变写到系统中
editor.commit();
}
————————————————————————————————————————————————————————————————————————
在使用SharedPreferences时常用的方法包括(方法具体含义参考官方文档):
[mw_shl_code=java,true]
1.Context.getSharedPreferences (String name, int mode)
2.Activity.getPreferences (int mode)
3.SharedPreferences.edit();
4.SharedPreferences.getXXX(name, defaultValue);
5.SharedPreferences.Editor.putXXX(name, value);
6.SharedPreferences.Editor.commit();
[/mw_shl_code]
步骤:
保存数据
[mw_shl_code=java,true]Log.d("SharedPreferences", "保存数据...");
//获得SharedPreferences对象
SharedPreferences settings = this.getSharedPreferences("shared_file", 0);
//获得可编辑对象
SharedPreferences.Editor editor = settings.edit();
editor.putString("name", "Kael Chen");
editor.putInt("age", 22);
editor.commit();
Log.d("SharedPreferences", "保存数据成功");[/mw_shl_code]
读取数据
[mw_shl_code=java,true]Log.d("SharedPreferences", "获取数据...");
SharedPreferences settings = this.getSharedPreferences("shared_file", 0);
String name = settings.getString("name", "no name");
int age = settings.getInt("age", 0);
Log.d("SharedPreferences", "name:" + name + ", age:" + age);
Log.d("SharedPreferences", "获取数据成功");[/mw_shl_code]
执行代码后,可以看到在data/data/pacakge name/shared_prefs/目录下多了一个shared_file.xml文件,文件名是由getSharedPreferences方法中传入的参数决定的。
文件内容如下:
[mw_shl_code=java,true]<?xml version='1.0' encoding='utf-8' standalone='yes' ?><map><string name="name">Kael Chen</string><int name="age" value="22" /></map>[/mw_shl_code]
可以看到,不同于ini文件的是,这里是严格区分了数据的类型的,所以在getXXX和putXXX相同数据时使用的类型一定要匹配。
--------------------------------------------------------------------------------
另外值得注意的是getSharedPreferences 方法中的mode参数以及getPreferences和getSharedPreferences 的区别。
getPreferences和getSharedPreferences的区别:
1、getPreferences只能由Activity调用,只在调用它的Activity范围内有效。
2、getSharedPreferences是由Context调用,在包范围内有效。可以这样理解,AndroidManifest.xml文件中定义了包的位置,比如我的测试程序中定义的包为cn.kael.sample,那么android会建立data/data/cn.kael.sample/shared_prefs/的目录,并在其下产生SharePreferences文件。因此如果已经在一个地方使用了SharedPrefernces,并创建了相应的SharedPrefernces文件,然后你想在另一个地方使用该SharedPrefernces文件,你只需要根据文件的路径规则判断在新的地方使用SharedPrefernces生成的路径是不是和之前SharedPrefernces文件的路径一致,就可以知道两者之间是否能够共用SharedPrefernces,即使它们不属于同一个应用程序(因为android是根据包名来决定SharedPrefernces文件的创建位置的,和应用程序名无关)。
关于mode参数:
要想在程序B想访问程序A的SharedPrefernces文件:
首先需要程序A在创建SharedPrefernces时使用MODE_WORLD_WRITEABLE或者MODE_WORLD_READABLE作为mode参数:
[mw_shl_code=java,true]SharedPreferences settings = this.getSharedPreferences("shared_file", Context.MODE_WORLD_WRITEABLE);[/mw_shl_code]
然后在程序B中需要先创建程序A的context对象,然后再通过这个context对象来调用getSharedPreferences方法:
[mw_shl_code=java,true]Context contextA = createPackageContext("cn.kael.sample", Context.CONTEXT_IGNORE_SECURITY);SharedPreferences settings = contextA.getSharedPreferences( "shared_file", Context.MODE_WORLD_WRITEABLE);[/mw_shl_code]