android: SharedPreferences实现记住密码功能
既然是实现记住密码的功能,那么我们就不需要从头去写了,因为在上一章中的最佳实 践部分已经编写过一个登录界面了,有可以重用的代码为什么不用呢?那就首先打开 BroadcastBestPractice 项目,来编辑一下登录界面的布局。修改 login.xml 中的代码,如下 所示:
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"
android:stretchColumns="1" >
……
<TableRow>
<CheckBox android:id="@+id/remember_pass" android:layout_height="wrap_content" />
<TextView android:layout_height="wrap_content" android:text="Remember password" />
</TableRow>
<TableRow>
<Button android:id="@+id/login" android:layout_height="wrap_content" android:layout_span="2" android:text="Login" />
</TableRow>
</TableLayout>
这里使用到了一个新控件,CheckBox。这是一个复选框控件,用户可以通过点击的方 式来进行选中和取消,我们就使用这个控件来表示用户是否需要记住密码。
然后修改 LoginActivity 中的代码,如下所示:
public class LoginActivity extends BaseActivity {
private SharedPreferences pref;
private SharedPreferences.Editor editor;
private EditText accountEdit; private EditText passwordEdit; private Button login;
private CheckBox rememberPass;
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.login);
pref = PreferenceManager.getDefaultSharedPreferences(this); accountEdit = (EditText) findViewById(R.id.account); passwordEdit = (EditText) findViewById(R.id.password); rememberPass = (CheckBox) findViewById(R.id.remember_pass); login = (Button) findViewById(R.id.login);
boolean isRemember = pref.getBoolean("remember_password", false);
if (isRemember) {
// 将账号和密码都设置到文本框中
String account = pref.getString("account", ""); String password = pref.getString("password", ""); accountEdit.setText(account); passwordEdit.setText(password);
rememberPass.setChecked(true);
}
login.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String account = accountEdit.getText().toString(); String password = passwordEdit.getText().toString();
if (account.equals("admin") && password.equals("123456")) {
editor = pref.edit();
if (rememberPass.isChecked()) { // 检查复选框是否被选中
editor.putBoolean("remember_password", true); editor.putString("account", account); editor.putString("password", password);
} else {
editor.clear();
}
editor.commit();
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
finish();
} else {
Toast.makeText(LoginActivity.this, "account or password is invalid", Toast.LENGTH_SHORT).show();
}
}
});
}
}
可以看到,这里首先在 onCreate()方法中获取到了 SharedPreferences 对象,然后调用它 的 getBoolean()方法去获取 remember_password 这个键对应的值,一开始当然不存在对应的 值了,所以会使用默认值 false,这样就什么都不会发生。接着在登录成功之后,会调用 CheckBox 的 isChecked()方法来检查复选框是否被选中,如果被选中了表示用户想要记住密 码,这时将 remember_password 设置为 true,然后把 account 和 password 对应的值都存入到 SharedPreferences 文件当中并提交。如果没有被选中,就简单地调用一下 clear()方法,将 SharedPreferences 文件中的数据全部清除掉。
当用户选中了记住密码复选框,并成功登录一次之后,remember_password 键对应的值 就是 true 了,这个时候如果再重新启动登录界面,就会从 SharedPreferences 文件中将保存的 账号和密码都读取出来,并填充到文本输入框中,然后把记住密码复选框选中,这样就完成 记住密码的功能了。
现在重新运行一下程序,可以看到界面上多出了一个记住密码复选框,如图 6.9 所示。
图 6.9
然后账号输入 admin,密码输入 123456,并选中记住密码复选框,点击登录,就会跳转 到 MainActivity。接着在 MainActivity 中发出一条强制下线广播会让程序重新回到登录界面, 此时你会发现,账号密码都已经自动填充到界面上了,如图 6.10 所示。
图 6.10
这样我们就使用 SharedPreferences 技术将记住密码功能成功实现了,你是不是对SharedPreferences 理解得更加深刻了呢? 不过需要注意,这里实现的记住密码功能仍然还只是个简单的示例,并不能在实际的项目中直接使用。因为将密码以明文的形式存储在 SharedPreferences 文件中是非常不安全的, 很容易就会被别人盗取,因此在正式的项目里还需要结合一定的加密算法来对密码进行保护才行。