概述
SharedPreferences的使用非常简单,能够轻松的存放数据和读取数据。SharedPreferences只能保存简单类型的数据,例如,String、int等。一般会将复杂类型的数据转换成Base64编码,然后将转换后的数据以字符串的形式保存在 XML文件中,再用SharedPreferences保存。
使用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方法相当于数据库事务中的提交(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
Demo
- import android.app.Activity;
- import android.content.SharedPreferences;
- import android.os.Bundle;
-
- public class PermissionActivity extends Activity {
- private final int[] MODES=new int[]{
- Activity.MODE_PRIVATE,
- Activity.MODE_WORLD_READABLE,
- Activity.MODE_WORLD_WRITEABLE,
-
- Activity.MODE_APPEND
- };
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- for(int i=0;i<MODES.length;i++){
- SharedPreferences mySharedPreferences=getSharedPreferences("data_"+String.valueOf(i+1),MODES[i]);
- SharedPreferences.Editor editor=mySharedPreferences.edit();
- editor.putString("name",String.valueOf(i+1));
- editor.commit();
- }
- }
- }
运行机制
Context内部实现
getSharedPreferences()方法本身是Context这个接口中定义的一个抽象方法,由ContextImpl类负责实现。
1 、调用getSharedPreferences()获取对应的的文件,该函数实现功能如下:
-
- private static final HashMap<File, SharedPreferencesImpl> sSharedPrefs =
- new HashMap<File, SharedPreferencesImpl>();
-
- @Override
- public SharedPreferences getSharedPreferences(String name, int mode){
-
- SharedPreferencesImpl sp;
- File f = getSharedPrefsFile(name);
- synchronized (sSharedPrefs) {
- sp = sSharedPrefs.get(f);
- if (sp != null && !sp.hasFileChanged()) {
-
- return sp;
- }
- }
-
- Map map = null;
- if (f.exists() && f.canRead()) {
- try {
- str = new FileInputStream(f);
- map = XmlUtils.readMapXml(str);
- str.close();
- }
- ...
- }
-
- synchronized (sSharedPrefs) {
- if (sp != null) {
-
- sp.replace(map);
- } else {
- sp = sSharedPrefs.get(f);
- if (sp == null) {
-
- sp = new SharedPreferencesImpl(f, mode, map);
- sSharedPrefs.put(f, sp);
- }
- }
- return sp;
- }
- }
2、 SharedPreferences 不过是个接口,它定义了一些操作xml文件的方法,其真正实现类为SharedPreferencesImpl ,该类是ContextIml的内部类,该类如下:
-
-
- private static final class SharedPreferencesImpl implements SharedPreferences{
- private Map mMap;
-
- public String getString(String key, String defValue) {
- synchronized (this) {
- String v = (String)mMap.get(key);
- return v != null ? v : defValue;
- }
- }
- ...
-
- public final class EditorImpl implements Editor {
- private final Map<String, Object> mModified = Maps.newHashMap();
- }
- }
-