既然是实现记住密码的功能,那么我们就不需要从头去写了,因为在上一章中的最佳实 践部分已经编写过一个登录界面了,有可以重用的代码为什么不用呢?那就首先打开 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 文件中是非常不安全的,
很容易就会被别人盗取,因此在正式的项目里还需要结合一定的加密算法来对密码进行保护
才行。