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           <!--<TextView
115                 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            <TextView
127                 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             @Override
38             public void onCheckedChanged(CompoundButton buttonView,
39                     boolean isChecked) {
40                 // TODO Auto-generated method stub
41                 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         @Override
69         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="true" />
5 <string name="USER_NAME">ning</string>
6 </map>

 

 

 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。