您的位置:首页 > 移动开发 > Android开发

Android中的记住密码功能与多应用的单点登录

2012-08-17 13:03 393 查看
现在很多流行的应用中都会有用户登录的模块,如手机QQ等,一般在这些用户登录的界面上都会有一个记住密码的复选框,一旦选中该复选框,那么下次开启应用时就会跳过登录界面,直接按上次的登录名和密码自动登录。下面我们就来看一下Android中如何实现该功能。
一. 原理说明:
其实记住密码功能无非就是把用户上次输入的密码和用户名保存在手机上,下次登录时去把保存的用户名和密码再取回而已。密码保存的方式分很多种,Android帮助文档中关于数据存储也有提到,主要有以下方式:

正常情况下,开发难度由上往下依次递增。对于记住密码的功能,一般推荐使用轻量级的数据存储方式--SharedPreferences。SharedPreferences是Android中存储简单数据的一个工具类。可以想象它是web应用中一个小小的Cookie,它通过用键值对的方式把简单数据类型(boolean、int、float、long和String)存储在应用程序的私有目录下(data/data/包名/shared_prefs/)自己定义的xml文件中。使用SharedPreferences方式存储数据的另一个好处就是可以和其它应用共享该数据。例如使用手机QQ的记住密码功能后,你手机里微信等腾讯开发的应用就不需要登录,他们会直接使用QQ的SharedPreferences里存储的用户名和密码登录。实现类似web中的单点登录的功能。
二.使用SharedPreferences实现记住密码功能

先看一下登录界面

当记住我的登录被选中时,则系统下次会自动登录。下面是实现思路:
1. 当程序运行时首先启动登录的Activity并完成SharedPreferences初始化工作,并获取上次记住的密码与用户名填充到对应文本框内.
// 初始化SharedPreferences

private void InitConfig() {

// MODE_WORLD_WRITEABLE代表该SharedPreferences可被其它应用访问

sp = getSharedPreferences("UserInfo", MODE_WORLD_WRITEABLE);

etxt_loginName.setText(sp.getString("uname", null));

if (sp.getBoolean("remember", false)){

etxt_password.setText(sp.getString("password", null));

}

tbtn_remember.setChecked(sp.getBoolean("remember", false));

}


2. 根据tbtn_remember是否被选中来决定是否进行自动登录操作.
private void login(Stringuname, String pwd) {

// 验证用户有效性

......

//是否记住密码的操作

if (tbtn_remember.isChecked()){

sp.edit() .putString("uname", etxt_loginName.getText().toString()) .commit();

sp.edit() .putString("password", etxt_password.getText().toString()) .commit();

} else {

//如果没有选择记住密码则清空SharedPreferencs

sp.edit().clear();

}

}


以上的方法都是在onCreate方法中调用,如下:
protected void onCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.login);

…//此处省略获取界面控件的代码

InitConfig();

if (tbtn_remember.isChecked()){

// 程序启动就自动登录   login(etxt_loginName.getText().toString().trim(), etxt_password.getText().toString().trim());

} else {

}

}


三.使用SharedPreferences实现多应用的单点登录
由于我们获取SharedPreferences时使用的模式是MODE_WORLD_WRITEABLE,所以其它应用也可以访问或修改该SharedPreferences,方法同InitConfig()中类似,如获取用户名:
//首先在其它应用中构建相对与上面应用的的上下文

Context context = this.createPackageContext("com.eric.sharedpreferences.test",Context.CONTEXT_IGNORE_SECURITY);

SharedPreferences sharedpre =context.getSharedPreferences("UserInfo ",Context.MODE_WORLD_WRITEABLE);

String uname=sp.getString("uname", null)


这样如果你开发的其它应用也需要使用该用户名和密码登录则可以通过这种数据共享的方式实现获取,实现了类似与web应用的单点登录功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: