一.SharedPreferences基本
要想使用SharedPreferences 来存储数据,首先需要获取到SharedPreferences对象。Android 中主要提供了三种方法用于得到SharedPreferences 对象。
1. Context 类中的getSharedPreferences()方法此方法接收两个参数,第一个参数用于指定SharedPreferences 文件的名称,如果指定的文件不存在则会创建一个, SharedPreferences 文件都是存放在/data/data/<package name>/shared_prefs/目录下的。第二个参数用于指定操作模式,主要有两种模式可以选择,MODE_PRIVATE 和MODE_MULTI_PROCESS。MODE_PRIVATE 仍然是默认的操作模式,和直接传入0 效果是相同的,表示只有当前的应用程序才可以对这个SharedPreferences 文件进行读写。MODE_MULTI_PROCESS 则一般是用于会有多个进程中对同一个SharedPreferences 文件进行读写的情况。类似地MODE_WORLD_READABLE 和MODE_WORLD_WRITEABLE 这两种模式已在Android 4.2 版本中被废弃。
2. Activity 类中的getPreferences()方法
这个方法和Context 中的getSharedPreferences()方法很相似,不过它只接收一个操作模式参数, 因为使用这个方法时会自动将当前活动的类名作为SharedPreferences 的文件名。
3. PreferenceManager 类中的getDefaultSharedPreferences()方法这是一个静态方法,它接收一个Context 参数,并自动使用当前应用程序的包名作为前缀来命名SharedPreferences 文件。
得到了SharedPreferences 对象之后,就可以开始向SharedPreferences 文件中存储数据了,主要可以分为三步实现。
(1). 调用SharedPreferences 对象的edit() 方法来获取一个SharedPreferences.Editor 对象。
(2). 向SharedPreferences.Editor 对象中添加数据,比如添加一个布尔型数据就使用putBoolean 方法,添加一个字符串则使用putString()方法,以此类推。
(3). 调用commit()方法将添加的数据提交,从而完成数据存储操作。
从SharedPreferences 文件中读取数据更加的简单。SharedPreferences 对象中提供了一系列的get 方法用于对存储的数据进行读取,每种get方法都对应了SharedPreferences. Editor 中的一种put 方法,比如读取一个布尔型数据就使用getBoolean()方法,读取一个字符串就使用getString()方法。这些get 方法都接收两个参数,第一个参数是键,传入存储数据时使用的键就可以得到相应的值了,第二个参数是默认值,即表示当传入的键找不到对应的值时,会以什么样的默认值进行返回。
二.程序示例
1.实现一个登陆框,如果勾选记住密码,则将密码保存起来,示意图
2.布局文件activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:stretchColumns="1"
>
<TableRow>
<TextView android:layout_height="wrap_content"
android:text="用户登录"
android:layout_span="2"
android:gravity="center"
android:padding="15dp"
android:layout_margin="15dp"/>
</TableRow>
<TableRow>
<TextView android:layout_height="wrap_content"
android:text="用户名"
android:textSize="18sp"
android:paddingRight="15dp"
android:paddingLeft="5dp"/>
<EditText android:id="@+id/username"
android:layout_height="wrap_content"
android:hint="请输入账号"
/>
</TableRow>
<TableRow>
<TextView android:layout_height="wrap_content"
android:text="密码"
android:textSize="18sp"
android:paddingRight="15dp"
android:paddingLeft="5dp"/>
<EditText android:id="@+id/password"
android:layout_height="wrap_content"
android:hint="请输入密码"
android:inputType="textPassword"
/>
</TableRow>
<TableRow>
<CheckBox android:layout_height="wrap_content"
android:text="记住密码"
android:layout_span="2"
android:id="@+id/remember"/>
</TableRow>
<TableRow>
<Button android:id="@+id/btn"
android:text="登录"
android:layout_height="wrap_content"
android:layout_span="2"/>
</TableRow>
</TableLayout>
3.MainActivity:
public class MainActivity extends Activity {
private SharedPreferences preferences;
private SharedPreferences.Editor editor;
private EditText username,password;
private Button btn;
private CheckBox remember;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
preferences = PreferenceManager.getDefaultSharedPreferences(this);
// 初始化控件
username = (EditText)findViewById(R.id.username);
password = (EditText)findViewById(R.id.password);
remember = (CheckBox)findViewById(R.id.remember);
btn = (Button)findViewById(R.id.btn);
boolean isRemember = preferences.getBoolean("remember_password", false);
if( isRemember ){
String account = preferences.getString("username", "");
String pwd = preferences.getString("password", "");
username.setText(account);
password.setText(pwd);
remember.setChecked(true);
}
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String account = username.getText().toString();
String pwd = password.getText().toString();
if( account.equals("admin") && pwd.equals("123456") ){
editor = preferences.edit();
if( remember.isChecked() ){
editor.putBoolean("remember_password", true);
editor.putString("username", account);
editor.putString("password", pwd);
}else{
editor.clear();
}
editor.commit();
Intent intent = new Intent(MainActivity.this, MainActivity.class);
startActivity(intent);
}else{
Toast.makeText(MainActivity.this, "登录错误", Toast.LENGTH_LONG).show();
}
}
});
}
}