首页 > 代码库 > Android-SharedPreferences

Android-SharedPreferences

SharedPreferences简介
在Android开发过程中,有时候我们需要保存一些简单的软件配置等简单数据的信息,而如果我们直接用数据库存储的话又不太方便,在这里我们就可以用到SharedPreferences,SharedPreferences保存的数据主要是类似于配置信息格式的数据,因此保存的数据主要是简单类型的键值对(key-value),它保存的是一个XML文件。

SharedPreferences常用的属性和方法

方法名称 描述
public abstract boolean contains (String key) 判断SharedPreferences是否包含特定key的数据
public abstract SharedPreferences.Editor edit ()返回一个Edit对象用于操作SharedPreferences
public abstract Map<String, ?> getAll () 获取SharedPreferences数据里全部的key-value对
getXXX(String key,XXX defvlaue)获取SharedPreferences数据指定key所对应的value,如果该key不存在,返回默认值defValue。其中XXX可以是boolean、float、int、long、String等基本类型的值

 

 

由于SharedPreference是一个接口,而且在这个接口里并没有提供写入数据和读取数据的能力。但是在其内部有一个Editor内部的接口,Edit这个接口有一系列的方法用于操作SharedPreference。

Editor接口的常用方法

方法名称描述
public abstract SharedPreferences.Editor clear ()清空SharedPreferences里所有的数据
public abstract boolean commit ()当Editor编辑完成后,调用该方法可以提交修改,而且必须要调用这个数据才修改
public abstract SharedPreferences.Editor putXXX (String key, boolean XXX)向SharedPreferences存入指定的key对应的数据,其中XXX可以是boolean、float、int、long、String等基本类型的值
public abstract SharedPreferences.Editor remove (String key) 删除SharedPreferences里指定key对应的数据项

 

 

SharedPreferences是一个接口,程序是无法创建SharedPreferences实例的,可以通过Context.getSharedPreferences(String name,int mode)来得到一个SharedPreferences实例

name:是指文件名称,不需要加后缀.xml,系统会自动为我们添加上。

一般这个文件存储在/data/data/<package name>/shared_prefs下(这个面试常问到)

mode:是指定读写方式,其值有三种,分别为:

Context.MODE_PRIVATE:指定该SharedPreferences数据只能被本应用程序读、写

Context.MODE_WORLD_READABLE:指定该SharedPreferences数据能被其他应用程序读,但不能写

Context.MODE_WORLD_WRITEABLE:指定该SharedPreferences数据能被其他应用程序读写。

 


 

SharedPreferences的使用

 

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

 下面使用一个登录界面记住密码的例子来说明一下:

布局文件:login.xml

  1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  2         android:id="@+id/editRel"  3         android:layout_width="fill_parent"  4         android:layout_height="wrap_content" >  5            <RelativeLayout  6               android:id="@+id/faceImgRel"  7               android:layout_width="fill_parent"  8               android:layout_height="wrap_content"  9               android:layout_marginTop="50dp" 10               android:gravity="center" > 11               <ImageView 12                   android:id="@+id/faceImg" 13                   android:scaleType="centerInside" 14                   android:layout_width="90dp" 15                   android:layout_height="90dp" 16                   android:contentDescription="@string/faceImgView" 17                   android:background="@drawable/login_head" /> 18         </RelativeLayout> 19  20         <RelativeLayout 21             android:id="@+id/accountRel" 22             android:layout_below="@id/faceImgRel" 23             android:layout_width="fill_parent" 24             android:layout_height="wrap_content" 25             android:layout_marginTop="14dp" 26             android:clickable="true" 27             android:gravity="center_vertical" > 28  29             <TextView 30                 android:id="@+id/account" 31                 android:padding="20dp" 32                 android:layout_width="wrap_content" 33                 android:layout_height="wrap_content" 34                 android:text="@string/account" 35                 android:textColor="#0099CC"  36                 android:textSize="17sp"/> 37  38             <EditText 39                 android:id="@+id/username" 40                 android:layout_width="fill_parent" 41                 android:layout_height="wrap_content" 42                 android:layout_centerVertical="true" 43                 android:textSize="15sp" 44                 android:layout_marginRight="20dp" 45                 android:layout_toRightOf="@id/account" 46                 android:hint="@string/accounthint" 47                 android:inputType="text" /> 48         </RelativeLayout> 49  50         <RelativeLayout 51             android:id="@+id/pwdRel" 52             android:layout_width="fill_parent" 53             android:layout_height="wrap_content" 54             android:layout_below="@id/accountRel" 55             android:clickable="true" 56             android:gravity="center_vertical" > 57  58             <TextView 59                 android:id="@+id/pwd" 60                 android:padding="20dp" 61                 android:layout_width="wrap_content" 62                 android:layout_height="wrap_content" 63                 android:text="@string/pwd" 64                 android:textColor="#0099cc" 65                 android:textSize="17sp" /> 66  67             <EditText 68                 android:id="@+id/password" 69                 android:layout_width="fill_parent" 70                 android:layout_height="wrap_content" 71                 android:layout_centerVertical="true" 72                 android:textSize="15sp" 73                 android:layout_toRightOf="@id/pwd" 74                 android:hint="@string/pwd"  75                 android:inputType="textPassword" 76                 android:layout_marginRight="20dp"/> 77         </RelativeLayout> 78         <RelativeLayout  79             android:id="@+id/btnloginRel" 80             android:layout_width="fill_parent" 81             android:layout_height="wrap_content" 82             android:layout_below="@id/pwdRel" 83             android:clickable="true" 84             android:gravity="center_vertical" > 85             <Button 86                 android:id="@+id/btnlogin" 87                 android:layout_width="fill_parent" 88                 android:layout_height="wrap_content" 89                 android:layout_margin="20dp" 90                 android:textColor="#FFFFFF" 91                 android:layout_centerVertical="true" 92                 android:background="@drawable/button_background"  93                 android:text="@string/login" /> 94         </RelativeLayout> 95         <RelativeLayout  96             android:id="@+id/funcRel" 97             android:layout_width="fill_parent" 98             android:layout_height="wrap_content" 99             android:layout_below="@id/btnloginRel"100             android:gravity="center_vertical" >101             102            103            <CheckBox  104             android:id="@+id/cb_rempwd"  105             android:layout_width="wrap_content"  106             android:layout_height="wrap_content"   107             android:layout_marginTop="15dip"108             android:layout_marginLeft="20dip"  109             android:text="@string/rem_pwd"  110             android:textColor="#0099cc"111                 android:textSize="16sp" />  112            113            114           <!--<TextView115                 android:id="@+id/forgetpwd"116                 android:layout_width="wrap_content"117                 android:layout_height="wrap_content"118                 android:layout_marginTop="15dip"119                 android:layout_marginLeft="20dip"120                 android:text="@string/forget_pwd"121                 android:textColor="#0099cc"122                 android:textSize="16sp" />123                 124                   --> 125                 126            <TextView127                 android:id="@+id/register"128                 android:clickable="true"129                 android:layout_width="wrap_content"130                 android:layout_height="wrap_content"131                 android:layout_alignParentRight="true"132                 android:layout_marginRight="20dip"133                 android:layout_marginTop="15dip"134                 android:text="@string/register"135                 android:textColor="@color/text_color_selector"136                 android:background="@drawable/textview_background" 137                 android:textSize="16sp" />138 139         </RelativeLayout>140         141     </RelativeLayout>
View Code

 

下面在LoginActivity.java文件开始使用SharedPreferences:

声明:只是使用的实例代码,并不是完整LoginActivity.java的代码,可在需要的地方添加上即可。

 1 public class LoginActivity extends Activity { 2     private EditText etuser; 3     private EditText etPass; 4     private Button login; 5         private TextView fgPwdTv; 6     private CheckBox rem_pwdBox; 7     private SharedPreferences sp;// 保存登录信息 8     protected void onCreate(Bundle savedInstanceState) { 9 10         super.onCreate(savedInstanceState);11         // 去掉窗口标题12         requestWindowFeature(Window.FEATURE_NO_TITLE);13         setContentView(R.layout.login);14         // 忘记密码设置下划线15         // fgPwdTv = (TextView)this.findViewById(R.id.forgetpwd);16         // fgPwdTv.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);17         etuser = (EditText) findViewById(R.id.username);18         etPass = (EditText) findViewById(R.id.password);19         login = (Button) findViewById(R.id.btnlogin);20         login.setOnClickListener(new LoginListener());21         sp = this.getSharedPreferences("userInfo", Activity.MODE_PRIVATE);22         rem_pwdBox = (CheckBox) findViewById(R.id.cb_rempwd);23 24         // 判断记住密码多选框的状态25         if (sp.getBoolean("CHECK_PWD", false)) {26             // 设置默认是记录密码状态27             rem_pwdBox.setChecked(true);28             Editor editor = sp.edit();29             editor.putBoolean("CHECK_PWD", true);30             editor.commit();31             etuser.setText(sp.getString("USER_NAME", ""));32             etPass.setText(sp.getString("PASSWORD", ""));33         }34 35         rem_pwdBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {36 37             @Override38             public void onCheckedChanged(CompoundButton buttonView,39                     boolean isChecked) {40                 // TODO Auto-generated method stub41                 if (isChecked) {42                     SharedPreferences.Editor edit = sp.edit();43                     edit.putBoolean("CHECK_PWD", true);44                     edit.putString("USER_NAME", etuser.getText().toString());45                     edit.putString("PASSWORD", etPass.getText().toString());46                     edit.commit();47                 }48                 if (!isChecked) {49 50                     SharedPreferences.Editor edit = sp.edit();51                     edit.putBoolean("CHECK_PWD", false);52                     edit.putString("USER_NAME", "");53                     edit.putString("PASSWORD", "");54                     edit.commit();55                 }56             }57         });58 59     }60 61     class LoginListener implements OnClickListener {62 63         /*64          * (non-Javadoc)65          * 66          * @see android.view.View.OnClickListener#onClick(android.view.View)67          */68         @Override69         public void onClick(View v) {70 71             username = etuser.getText().toString();72             // password = SHA1(etPass.getText().toString());73             password = etPass.getText().toString();74             // 登录成功和记住密码框为选中状态才保存用户信息75             if (rem_pwdBox.isChecked()) {76                 // 记住用户名、密码、77                 Editor editor = sp.edit();78                 editor.putBoolean("CHECK_PWD", true);79                 editor.putString("USER_NAME", username);80                 editor.putString("PASSWORD", password);81                 editor.commit();82             }   83                       ......84 85     }86 }

 

 而生成的userInfo.xml:

1 <?xml version=‘1.0‘ encoding=‘utf-8‘ standalone=‘yes‘ ?>2 <map>3 <string name="PASSWORD">1234</string>4 <boolean name="CHECK_PWD" value="http://www.mamicode.com/true" />5 <string name="USER_NAME">ning</string>6 </map>

 

 

 

 

Android-SharedPreferences