SharedPreferences是一种轻型的数据存储方式。我们和密码、位置信息等通常用它来保存一些软件的配置信息,例如,用户名等。其本质是以XML文件形式以键值对的形式来保存一些数据的。通常保存int 、String类型的数据。也可以保存一些复杂的数据,但是这些复杂的数据最终还是要转换成int 、String 类型的形式来保存。 复杂的数据我们也没有必要使用这种轻量级的数据存储方式了。我们直接使用数据库来存储了。接下来好好地认识一下吧。和以前一样我们给出官方的API 点击打开链接
SharedPreferences的存储流程
(1)获取SharedPreferences对象
(2)获取SharedPreferences.Editor对象(因为SharedPreferencesd对象不能直接进行存储,存储实现通过Editor对象实现)
(3)通过Editor接口的putXxxx方法保存
(4)通过Editor.commit提交
下面根据上面的步骤使用代码来看一下如何做
//获取SharedPreferences对象接下来得到保存的数据并在后台输出。默认值最好给出。
//SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
SharedPreferences pref=getSharedPreferences("my_pref", MODE_PRIVATE);
/**
* 第一个是调用PreferenceManager类中的getDefaultSharedPreferences()方法,而这个方法是静态的,
接收一个Context参数,自动使用包名作为前缀命名
第二个是调用Activity类中的getPerferences()方法,接收的是一个操作模式参数,文件名为活动名
*/
Editor editor=pref.edit();
//存入数值
editor.putBoolean("booleanData", false);
editor.putFloat("floatData", (float) 11.11);
editor.putInt("intData", 20);
editor.putLong("longData", System.currentTimeMillis());
editor.putString("stringData", "fengdongdong");
//提交
editor.commit();
getSharedPreferences("my_pref",MODE_PRIVATE);第二个参数怎么设置呢?有如下几种方式:
//第一个参数为键,第二个参数为默认值最后的显示结果
System.out.println(pref.getString("stringData", "默认值"));
System.out.println(pref.getLong("longData",(long) 0.0));
System.out.println(pref.getInt("intData", 0));
System.out.println(pref.getFloat("floatData", (float) 0.00));
System.out.println(pref.getBoolean("booleanData", true));
数据改变时的监听事件:
那当我们Sharedpreferences里面保存的数据改变了,我们如何去知道呢?官方还给出了一些监听事件
SharedPreferences.OnSharedPreferenceChangeListener onSharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
}
};
sharedPreferences.registerOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener);//注册数据变化监听
sharedPreferences.unregisterOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener);//解注册数据变化监听
但是我们需要注意一些问题:我们注册的时候尽量在Activity的Resume里面去注册。在Activity的destory里面去解注册。
因为我们监听事件如果时间长了的话,系统会将监听器当做垃圾给回收掉。
实例:保存用户名与密码
先看一下布局
接下来给出逻辑代码
public class MainActivity1 extends Activity {
private EditText et_username;
private EditText et_password;
private CheckBox check;
private SharedPreferences pref;
private Editor editor;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
super.onCreate(savedInstanceState);
pref=getSharedPreferences("pres1", MODE_PRIVATE);
editor=pref.edit();
et_username=(EditText) findViewById(R.id.et_username);
et_password=(EditText) findViewById(R.id.et_password);
check=(CheckBox) findViewById(R.id.check_bt);
//再次登录时首先拿到上次保存的信息
String username=pref.getString("username", "");
String password=pref.getString("password", "");
if(username==null&&password==null){ //说明我们上次登录没有保存用户名和密码
check.setChecked(false);
}else{ //我们上次登录保存了信息
check.setChecked(true);//将复选框勾上
//将上次保存的信息显示在编辑框中
et_username.setText(username);
et_password.setText(password);
}
}
//按钮的监听事件
public void doClick(View view){
String username=et_username.getText().toString().trim();
String password=et_password.getText().toString().trim();
//我们假设admin 123456表示登陆成功
switch (view.getId()) {
case R.id.login_bt:
if("admin".equals(username)&&"123456".equals(password)){
//我们登录时首先判断,是否要记住密码
if(check.isChecked()){
//当为记住密码时,现将这次登陆的用户名和密码保存起来
editor.putString("username", username);
editor.putString("password", password);
editor.commit();
Toast.makeText(MainActivity1.this,"保存了用户名与密码", Toast.LENGTH_SHORT).show();
}else{
//如果不需要保存,则将上次保存的信息也移除掉
editor.remove("username");
editor.remove("password");
editor.commit();
Toast.makeText(MainActivity1.this,"移除了用户名与密码", Toast.LENGTH_SHORT).show();
}
}else{//信息不匹配
Toast.makeText(MainActivity1.this,"登录失败", Toast.LENGTH_SHORT).show();
}
break;
}
}
}