首页 > 代码库 > 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保存。
(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>
下面在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