使用SharedPreferences实现android程序自动登录和记住密码

在目前的android软件中, 经常是需要登录的, 但是登录过程是比较麻烦的, 特别是我们的密码, 设置简单不安全, 设置复杂输入不方便, 因此自动记住密码, 自动登录功能是比较必要的。

本文提供一种简单的自动登录, 记住密码的功能, 这个仅仅简单的方法, 更安全的方法可以继续在这个基础上进行相关加密来实现。

一.自动登录相关需求

1. 记住密码, 是帮助用户记住密码, 减少用户输入的过程, 但是这个情况下 用户还是要选择登录 按钮进行登录

程序仅仅在用户登录成功后, 并且勾选了记住密码的选项后才将用户密码保存起来。

2. 自动登录, 是根据自动记录的用户和密码, 自动帮助用户到服务器登录, 判断登录是否成功, 若是登录成功自动跳转到 后续工作流程

若是登录不成功, 显示登录页面, 用户继续输入用户名和密码, 然后在登录

程序在判断登录成功后, 并且选择了 自动登录后, 自动保存用户名和密码,然后设置自动登录标志位。

下一次再次进入登录界面时,自动读入自动登录标志和用户名及密码, 代替用户登录,若是登录成功, 则进行后续操作,否则显示登录页面,要求用户登录。

3. 清除自动登录功能,  在另外页面上 要有能力清除自动登录的状态功能,清除后也自动清除了保存的用户名和密码

4. 清除保存密码功能,  在另外页面上要有 清除已经保存密码的功能

仅仅清除了保存的密码, 这样自动登录功能也就不能工作了, 因此自动登录也被清除。

这些都是 业务上的需求, 不是技术上限制。

技术上我们仅仅需要一个安全的保存相关数据的办法

wps199e.tmp_thumb[1]

上图是一个简单等登录界面, 在这个程序中,我们没有实现真正的服务器登录, 仅仅用一个函数来表示服务器登录。 在函数内部通过判断用户名和密码是否相等, 若是相等就假设是登录成功。否则登录不成功。

将来仅仅需要替换函数内部实现就可以实现服务器登录等。

二. 自动登录技术准备

自动登录技术上 主要是如何保存用户的数据, 包括用户名,密码, 登录标志等。

下面是个简单的办法:

下面是从网络上摘抄的内容如下:

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数据能被其他应用程序读写。

三. 自动登录程序实现

为了实现自动登录功能,我们需要两个activity, 一个是LoginActivity, 用来进行登录相关工作

wps19af.tmp_thumb[1]

一个是WelcomeActivity,用户显示登录后的页面,同时包括清除相关自动登录的功能等

wps19bf.tmp_thumb[1]

请特别注意, 在WelcomeActivity中必须选择先清除自动登录功能, 才能返回到 login页面(否则, 到了login后又自动登录回来了,因此看不到效果)

 

1. 登录功能实现

相关功能要点如下, 详细情况参考源代码

// 这个非常重要,这个是获取相关存储设施的代码

//获得实例对象, 这个对象 保存相关设置, 程序启动时 根据这个进行选择相关行为

sp = this.getSharedPreferences("userInfo", Context.MODE_PRIVATE);

>>>>>>>>>>>>>>>>>>>>>>>>>

public class LoginActivity extends Activity {

// 定义必要的  控件对象

private EditText userName, password;

private CheckBox rem_pw, auto_login;

private Button btn_login;

private ImageButton btnQuit;

private String userNameValue,passwordValue;

private SharedPreferences sp;

// 大部分功能在 create方法中进行, 这样屏幕没有 闪烁就 自动登录到别的界面中了

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//去除标题

this.requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.login);

// 这个非常重要,这个是获取相关存储设施的代码

//获得实例对象, 这个对象 保存相关设置, 程序启动时 根据这个进行选择相关行为

sp = this.getSharedPreferences("userInfo", Context.MODE_PRIVATE);

userName = (EditText) findViewById(R.id.et_zh);

password = (EditText) findViewById(R.id.et_mima);

rem_pw = (CheckBox) findViewById(R.id.cb_mima);

auto_login = (CheckBox) findViewById(R.id.cb_auto);

btn_login = (Button) findViewById(R.id.btn_login);

btnQuit = (ImageButton)findViewById(R.id.img_btn);

//判断记住密码多选框的状态

if(sp.getBoolean("ISCHECK", false))

{

//设置默认是记录密码状态

rem_pw.setChecked(true);

userName.setText(sp.getString("USER_NAME", ""));

password.setText(sp.getString("PASSWORD", ""));

//判断自动登陆多选框状态

if(sp.getBoolean("AUTO_ISCHECK", false))

{

//设置默认是自动登录状态

auto_login.setChecked(true);

//跳转界面

Intent intent = new Intent(LoginActivity.this,LogoActivity.class);

LoginActivity.this.startActivity(intent);

}

}

// 登录监听事件  现在默认为用户名为:liu 密码:123

btn_login.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

userNameValue = userName.getText().toString();

passwordValue = password.getText().toString();

if(LoginHelper.checkLogin(userNameValue,passwordValue))

//                if(userNameValue.equals("liu")&&passwordValue.equals("123"))

{

Toast.makeText(LoginActivity.this, R.string.toast_login_ok, Toast.LENGTH_LONG).show();

//  Toast.makeText(LoginActivity.this,"登录成功", Toast.LENGTH_SHORT).show();

//登录成功和记住密码框为选中状态才保存用户信息

if(rem_pw.isChecked())

{

//记住用户名、密码、

Editor editor = sp.edit();

editor.putString("USER_NAME", userNameValue);

editor.putString("PASSWORD",passwordValue);

editor.commit();

}

//跳转界面

Intent intent = new Intent(LoginActivity.this,LogoActivity.class);

LoginActivity.this.startActivity(intent);

//finish();

}else{

Toast.makeText(LoginActivity.this, R.string.toast_1, Toast.LENGTH_LONG).show();

//         Toast.makeText(LoginActivity.this,"用户名或密码错误,请重新登录", Toast.LENGTH_LONG).show();

}

}

});

//监听记住密码多选框按钮事件

rem_pw.setOnCheckedChangeListener(new OnCheckedChangeListener() {

public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {

if (rem_pw.isChecked()) {

System.out.println("记住密码已选中");

sp.edit().putBoolean("ISCHECK", true).commit();

}else {

System.out.println("记住密码没有选中");

sp.edit().putBoolean("ISCHECK", false).commit();

}

}

});

//监听自动登录多选框事件

auto_login.setOnCheckedChangeListener(new OnCheckedChangeListener() {

public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {

if (auto_login.isChecked()) {

System.out.println("自动登录已选中");

sp.edit().putBoolean("AUTO_ISCHECK", true).commit();

} else {

System.out.println("自动登录没有选中");

sp.edit().putBoolean("AUTO_ISCHECK", false).commit();

}

}

});

btnQuit.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

finish();

}

});

}

}

<<<<<<<<<<<<<<<<<<<<<<<<<

2. 登录结果和清除登录

没什么特别注意的

public class WelcomeActivity extends Activity {

private SharedPreferences sp;

private Button bt_clearAutoLogin;

private Button bt_clearPasswd;

private Button bt_return_login;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.welcome);

//获得实例对象, 这个对象 保存相关设置, 程序启动时 根据这个进行选择相关行为

sp = this.getSharedPreferences("userInfo", Context.MODE_PRIVATE);

bt_clearAutoLogin = (Button) findViewById(R.id.bt_clearAutoLogin);

bt_clearPasswd = (Button) findViewById(R.id.bt_clearPasswd);

bt_return_login = (Button) findViewById(R.id.bt_return_login);

bt_clearAutoLogin.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

sp.edit().putBoolean("AUTO_ISCHECK", false).commit();

Toast.makeText(WelcomeActivity.this, R.string.toast_clear_autologin, Toast.LENGTH_LONG).show();

//   Toast.makeText(WelcomeActivity.this, "清除自动登录成功", Toast.LENGTH_SHORT).show();

}

});

bt_clearPasswd.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

//记住用户名、密码、

SharedPreferences.Editor editor = sp.edit();

//editor.putString("USER_NAME", userNameValue);

editor.putString("PASSWORD","");

editor.commit();

sp.edit().putBoolean("ISCHECK", false).commit();

//  Toast.makeText(WelcomeActivity.this, "清除保存的密码成功", Toast.LENGTH_SHORT).show();

Toast.makeText(WelcomeActivity.this, R.string.toast_clear_savepasswd, Toast.LENGTH_LONG).show();

}

});

bt_return_login.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

Intent intent = new Intent(WelcomeActivity.this,LoginActivity.class);

WelcomeActivity.this.startActivity(intent);

}

});

}

}

附件: apk下载

源代码:源代码下载

发表评论