SharedPreferences是Android系统提供的一种轻量级的数据存储方式,主要用来存储一些简单的数据,如系统登录的用户名和密码等,或者存储常用的系统配置信息,如窗口状态等。
SharedPreferences可以保存和检索的各种基本数据类型(boolean、float、int、long、string)的持久键值对,是基于XML文件存储的key-value键值对数据,该XML文件存储在手机的data/data/
利用SharedPreferences进行数据存取的基本用法如下:
(1)获取SharedPreferences对象
可以通过两种方式获取SharedPreferences对象。
方法一:调用Context对象的getSharedPreferences()方法,基本代码如下:
getSharedPreferences(String name,int mode);
方法二:调用Activity对象的getPreferences()方法,基本代码如下:
getPreferences(int mode);
根据参数name,可以获取相应的SharedPreferences对象,name表示要操作的XML文件名;参数mode有以下几个可选值。
Context.MODE_PRIVATE : 指定该SharedPreferences数据只能被本应用程序进行读、写操作。
Context.MODE_WORLD_WRITEABLE :指定该SharedPreferences数据能被其他应用读,写。
Context.MODE_WORLD_READABLE :指定该SharedPreferences数据能被其他应用程序读,但是不能写。
Context.MODE_MULTI_PROCESS : 这是SDK 2.3之后添加的选项,当多个进程读写同一个SharedPreferences时,它会检查文件是否被修改。
以上两种方法的区别:
第一种方法(getSharedPreferences())获取的SharedPreferences对象可以被同一应用程序下的其他组件共享;
第二种方法(getPreferences())获取的SharedPreferences对象只能在该Activity中使用
(2)向 SharedPreferences中写入值
首先,通过SharedPreferences.Editor获取Editor对象。
然后,使用对应具体数据类型的Editor的相应方法(如putBoolean()或putString()等)来存入值。
最后,调用Editor的commit()方法提交写入值的操作。
另外,Editor还有两个常用的方法,用来从Preferences中移除键值。
editor.remove(String key): 用于下次通过commit()方法提交操作时移除key对应的键值对。
editor.clear(): 用于移除所有键值对。
(3)从SharedPreferences中读写值
使用对应具体数据类型的Editor的相应方法getXxxx()来读取键值。
示例:开发一个Android应用程序,利用SharedPreferences来存储当前输入的用户名和密码信息,通过单击相应的功能按钮,来实现数据的保存、提取和移除所有键值对等基本功能。
XML布局代码如下:
MainActivity.java文件:
import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
//定义各个控件
private EditText username;
private EditText password;
//1.定义要保存SharedPreferences的XML文件
String PREFS_NAME = "ex13_1.mySharedPreferences.unm_pwd";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
username = (EditText) findViewById(R.id.editText1);
password = (EditText) findViewById(R.id.editText2);
final Button button1 = (Button)findViewById(R.id.button1);
final Button button2 = (Button)findViewById(R.id.button2);
final Button button3 = (Button)findViewById(R.id.button3);
//数据保存
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//2.定义一个只允许本程序访问的SharedPreFerences对象
SharedPreferences settings = getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
//3.生成一个保存编辑变量
SharedPreferences.Editor editor = settings.edit();
//4.添加要保存的键值和真值
editor.putString("username",username.getText().toString());
editor.putString("password",password.getText().toString());
//5.提交数据保存
editor.commit();
//清空输入
username.setText("");
password.setText("");
Toast.makeText(MainActivity.this,"数据保存完成",Toast.LENGTH_LONG).show();
}
});
//数据提取
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//提取保存的用户名,如果无则为空
username.setText(getUserName());
//提取保存的密码,如果无则为空
password.setText(getPassWord());
Toast.makeText(MainActivity.this,"数据提取完成",Toast.LENGTH_LONG).show();
}
});
//移除所有键值对
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences settings = getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE);
//生成一个保存编辑对象
SharedPreferences.Editor editor = settings.edit();
//移除所有键值对
editor.clear();
editor.commit();
username.setText("");
password.setText("");
Toast.makeText(MainActivity.this,"移除所有键值对成功",Toast.LENGTH_LONG).show();;
}
});
}
private String getUserName(){
SharedPreferences settings = getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE);
//获取一个键值为"username"的值,若Preference中不存在,就用后面的值作为返回值
String username = settings.getString("username","");
return username;
}
private String getPassWord(){
SharedPreferences settings = getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE);
//获取一个键值为"username"的值,若Preference中不存在,就用后面的值作为返回值
String password = settings.getString("password","");
return password;
}
}
运行即可。