今天完善了自己app的登录界面,主要就是添加了记住密码和自动登录的功能,记录一下怎么利用轻量级的储存SharedPreferences来实现这两个功能。
先说一下SharedPreferences介绍:
SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置参数,它是采用xml文件存放数据的,文件存放在"/data/data<package name>/shared_prefs"目录下。
SharedPreferences的用法:
由于SharedPreferences是一个接口,而且在这个接口里没有提供写入数据和读取数据的能力。但它是通过其Editor接口中的一些方法来操作SharedPreference的,用法见下面代码:
Context.getSharedPreferences(String name,int mode)来得到一个SharedPreferences实例
name:是指文件名称,不需要加后缀.xml,系统会自动为我们添加上。
mode:是指定读写方式,其值有三种,分别为:Context.MODE_PRIVATE:指定该SharedPreferences数据只能被本应用程序读、写
Context.MODE_WORLD_READABLE:指定该SharedPreferences数据能被其他应用程序读,但不能写
Context.MODE_WORLD_WRITEABLE:指定该SharedPreferences数据能被其他应用程序读写。
老规矩,效果图:
实现步骤以及需要注意的一些逻辑问题:
在登录代码(LoginActivity.class)中:
(1)先声明变量sp和相关的控件(登录按钮,两个CheckBox和两个输入框),以及注册监听登录按钮
...//这里省略了导入的包,代码也有所删减,主要为实现功能的代码段,根据自己的项目再进行添加修改
/**
* xuboyu
* 登陆实现
*/
public class LoginActivity extends Activity {
private Button login;//登录按钮
private EditText et1;//输入账号输入框
private EditText et2;//输入密码输入框
private CheckBox remember_key;//记住密码勾选框
private CheckBox automatic_login;//自动登录选框
private SharedPreferences sp;
private String userNameValue;
private String passwordValue;
private Context mContext = this;
private Boolean rem_isCheck = false;
private Boolean auto_isCheck = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_activity);
//打开Preferences,名称为userInfo,如果存在则打开它,否则创建新的Preferences
//Context.MODE_PRIVATE:指定该SharedPreferences数据只能被本应用程序读、写
//Context.MODE_WORLD_READABLE:指定该SharedPreferences数据能被其他应用程序读,但不能写
//Context.MODE_WORLD_WRITEABLE:指定该SharedPreferences数据能被其他应用程序读写。
sp = this.getSharedPreferences("userInfo", Context.MODE_WORLD_READABLE);
//对but进行实例化
login = (Button) findViewById(R.id.login_button);
remember_key = (CheckBox) findViewById(R.id.remember_key);
automatic_login = (CheckBox) findViewById(R.id.automatic_login);
//创建but的单击事件,参数要传匿名内部类
et1 = (EditText) findViewById(R.id.login_user_et);
et2 = (EditText) findViewById(R.id.login_pwd_et);
rem_isCheck = remember_key.isChecked();
auto_isCheck = automatic_login.isChecked();
remember_key.setChecked(true);//设置记住密码初始化为true
//判断记住密码多选框的状态
if (sp.getBoolean("rem_isCheck", false)) {
//设置默认是记录密码状态
remember_key.setChecked(true);
et1.setText(sp.getString("USER_NAME", ""));
et2.setText(sp.getString("PASSWORD", ""));
Log.e("自动恢复保存的账号密码", "自动恢复保存的账号密码");
//判断自动登陆多选框状态
if (sp.getBoolean("auto_isCheck", false)) {
//设置默认是自动登录状态
automatic_login.setChecked(true);
//跳转界面
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
LoginActivity.this.startActivity(intent);
Toast toast1 = Toast.makeText(getApplicationContext(), "已自动登录", Toast.LENGTH_SHORT);
Log.e("自动登陆", "自动登陆");
}
}
//登录按钮监听方法
login.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
userNameValue = et1.getText().toString();
passwordValue = et2.getText().toString();
//这里账号密码为假设,因为自己的项目有用到网络请求,就没贴出来,这是简单的实现思路
if (userNameValue.equals("xuboyu") && passwordValue.equals("123456")) {
Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
//登录成功和记住密码框为选中状态才保存用户信息
if (rem_isCheck.isChecked()) {
//记住用户名、密码、
Editor editor = sp.edit();
editor.putString("USER_NAME", userNameValue);
editor.putString("PASSWORD", passwordValue);
editor.putBoolean("rem_isCheck", rem_isCheck);
editor.putBoolean("auto_isCheck", auto_isCheck);
editor.commit();
Log.e("选中保存密码", "账号:" + userNameValue +
"\n" + "密码:" + passwordValue +
"\n" + "是否记住密码:" + rem_isCheck +
"\n" + "是否自动登陆:" + auto_isCheck);
editor.commit();
}
//跳转界面
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
LoginActivity.this.startActivity(intent);
//finish();
} else {
Toast.makeText(LoginActivity.this, "用户名或密码错误,请重新登录", Toast.LENGTH_LONG).show();
}
}
});
}
}
效果图如下:
(3)将(2)中的代码和(1)的代码合并,再根据自己的项目进行修改~
我的运行结果:
*记住密码*
*自动登录*
(4)退出登录时注意清除原先保存的数据
//清除登录界面的自动登录和记住密码的代码
sp.edit().putBoolean("automatic_login",false).commit();
sp.edit().putBoolean("rem_isCheck",false).commit();