Android——SharedPreferences实现登录界面的记住密码和自动登录功能

一、项目开发

1、项目运行效果图

2、开发概要

       主要功能SharedPreferences介绍,其是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置,比如Activity状态,Activity暂停时,将此activity的状态保存到SharedPereferences中;当Activity重载,系统回调方法onSaveInstanceState时,再从SharedPreferences中将值取出。

SharedPreferences数据的四种操作模式
  • Context.MODE_PRIVATE
  • Context.MODE_APPEND
  • Context.MODE_WORLD_READABLE
  • Context.MODE_WORLD_WRITEABLE
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件.
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入
       本项目中利用的是Context.MODE_PRIVATE模式,项目运行初始化是默认的记住密码状态,当勾选自动登录的时候记住密码会自动勾选,当以记住密码的状态正确登录过一次之后,系统会记住密码,将数据信息存入Android系统,ShredPreferences中的信息以XML文件的形式保存在 /data/data/cn.edu.bzu.aminiTwitter/userInfo目录下。当系统以自动登录状态正确登录过一次之后,那么系统下一次登录就会自动调取数据进入ShowActivity.xml中。

二、开发Android-SharedPreferences程序讲解

1、项目文件如下:

2、项目开发步骤

   1、新建一个项目名字为aminiTitter,在布局文件activity_main.xml中设置文件布局,主要代码如下:

        



    

        
        //用户名
        
        

        
         //密码
        
        //登录事件
        

文本文件string.xml,代码如下:




    aminiTwitter
    Settings
    Hello world!
    账号:
    Email或手机号
    密码:
    登陆
    没有账号?注册
    记住密码
    自动登录
    登录成功!
    点击返回
    MainActivity

注意: 册上可以写连接的地址。

布局文件background_login_div_bg.xml和background_login.xml文件代码部分如下:

background_login_div_bg.xml:



    
    

background_login.xml:



    

 

2、重点来啦,主要代码在MainActivity.xml文件中,那么代码部分如下:

package cn.edu.bzu.aminitwitter;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
	private CheckBox cbJiYi;
	private CheckBox cbZiDongDengLu;
	private EditText etName,etPassword;
	private SharedPreferences sharedPreferences;  
	private Button btnClick;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        findById();
      //设置默认记住密码的状态
        if(sharedPreferences.getBoolean("cbJiYi", true)){
        	cbJiYi.setChecked(true);
            etName.setText(sharedPreferences.getString("etName", ""));
            etPassword.setText(sharedPreferences.getString("etPassword", ""));
        }
      //判断自动登陆多选框的状态
        if(sharedPreferences.getBoolean("cbcbZiDongDengLu", false)){
            //设置默认自动登陆的状态   
        	cbZiDongDengLu.setChecked(true);
            //跳转界面
            Intent intent = new Intent(MainActivity.this,ShowActivity.class);
            startActivity(intent);
        }
        //监听自动登陆多选框事件
        cbZiDongDengLu.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if(cbZiDongDengLu.isChecked()){
                	//勾选事件
                	cbJiYi.setChecked(true);
                	sharedPreferences.edit().putBoolean("cbZiDongDengLu", true).commit();
                }else{
                	sharedPreferences.edit().putBoolean("cbZiDongDengLu", false).commit();
                }
            }
        });
    }


    private void findById() {
		// TODO Auto-generated method stub
    	cbJiYi=(CheckBox) findViewById(R.id.cbJiYi);
    	cbZiDongDengLu=(CheckBox) findViewById(R.id.cbZiDongDengLu);
    	etName=(EditText) findViewById(R.id.etName);
    	etPassword=(EditText) findViewById(R.id.etPassword);
    	btnClick=(Button) findViewById(R.id.btnName);
    	//创建shareaPreferences对象用来存、取数据,文件名userInfo;
        sharedPreferences=this.getSharedPreferences("userInfo", Context.MODE_PRIVATE);
	}


	@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
	}
    public void btnClick(View view){
    	if(etName.getText().toString().equals("abc") && etPassword.getText().toString().equals("aaa")){
    		//如果选中记住密码
        	if(cbJiYi.isChecked()){
//        		sharedPreferences.edit().putBoolean("ISCHECK", true).commit();
        		//存入
        		Editor editor=sharedPreferences.edit();
        		editor.putString("etName", etName.getText().toString());
        		editor.putString("etPassword", etPassword.getText().toString());
        		editor.commit();
        		//取出
        		String etName=sharedPreferences.getString("etName", "");
        		String etPassword=sharedPreferences.getString("etPassword", "");
        		Log.d("MainActivity", "etName="+etName+"\netPassword="+etPassword+"\n");
        		Toast.makeText(MainActivity.this, "记住用户名和密码", Toast.LENGTH_LONG).show(); 
        	}else {
        		    //如果没选中记住密码
            		Toast.makeText(this, "没有记住用户名和密码", Toast.LENGTH_LONG).show();
            		etName.setText("");
            		etPassword.setText("");
//            		sharedPreferences.edit().putBoolean("ISCHECK", false).commit();  
        	}
        	Intent intent=new Intent(MainActivity.this, ShowActivity.class);
        	startActivity(intent);
        	//finish();
        	if(cbJiYi.isChecked() && cbZiDongDengLu.isChecked()){
            	startActivity(intent);
            	//finish();
        	}
    	}else{
    		Toast.makeText(MainActivity.this, "登录失败!", Toast.LENGTH_LONG).show();
    	}
    }
}


主要是数据的存入和取出利用,设置多选框的默认状态的记住密码、自动登录的监听事件,默认状态是记住密码,不自动登录,在btnClick实践中判断etName、etPasswprd是否为空,然后再确定执行语句,验证密码后在确定是否执行跳转,跳转到activity_show.xml中。

3、新建另一个简单的xml文件,activity_show.xml代码如下:


    
    
    //返回
    


4、修改ShowActivity.java文件,代码部分如下:

package cn.edu.bzu.aminitwitter;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;

public class ShowActivity extends Activity {
	private Button btnBack;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//去除标题

this.requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.activity_show); btnBack=(Button) findViewById(R.id.btnBack); btnBack.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { // TODO Auto-generated method stub //返回 finish(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.show, menu); return true; } }

第二种简单方式:

public class LoginActivity extends Activity {
	private EditText etUser,etPassword;//定义用户名和密码
	private CheckBox cbRemember;//定义记住密码
	private Button btnLogin;//登录按钮
	
	private SharedPreferences mSpSettings=null;//声明一个sharedPreferences用于保存数据
	private static final String PREPS_NAME="NamePwd";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_login);
		setTitle("登录界面");
		findById();//获取控件
		setListener();//绑定事件
		getData();
	}
	private void setListener() {
		btnLogin.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				if(etUser.getText().toString().equals("zsh")&&etPassword.getText().toString().equals("123")){
					//判断是否记住密码,复选框是否选中
					if(cbRemember.isChecked()){
						mSpSettings=getSharedPreferences(PREPS_NAME, MODE_PRIVATE);
						Editor edit=mSpSettings.edit();//得到Editor对象
						edit.putBoolean("isKeep", true);//记录保存标记
						edit.putString("username", etUser.getText().toString());//记录用户名
						edit.putString("password", etPassword.getText().toString());//记录密码
						edit.commit();//**提交
					}else {
						mSpSettings=getSharedPreferences(PREPS_NAME, MODE_PRIVATE);
						Editor edit=mSpSettings.edit();
						edit.putBoolean("isKeep", true);//保存的文件名isKeep
						edit.putString("username", "");
						edit.putString("password", "");
						edit.commit();
					}
					//跳转
					Intent intent=new Intent(LoginActivity.this, LoginShowActivity.class);
					startActivity(intent);
				}else{
					Toast.makeText(LoginActivity.this, "密码或者用户名错误", Toast.LENGTH_SHORT).show();
				}
			}
		});
	}
	@Override
	protected void onResume() {
		super.onResume();
		getData();//在界面显示数据之前得到之前存储的数据
	}
	private void getData() {
		mSpSettings=getSharedPreferences(PREPS_NAME, MODE_PRIVATE);
		if(mSpSettings.getBoolean("isKeep", false)){
			//如果之前存储过,则显示在相应文本框内
			etUser.setText(mSpSettings.getString("username", ""));
			etPassword.setText(mSpSettings.getString("password", ""));
		}else{//否则显示为空
			etUser.setText("");
			etPassword.setText("");
		}
	}
	private void findById() {
		etUser=(EditText) findViewById(R.id.etUser);
		etPassword=(EditText) findViewById(R.id.etPassword);
		cbRemember=(CheckBox) findViewById(R.id.cbRemember);
		btnLogin=(Button) findViewById(R.id.btnLogin);
	}

}


5、在调试过程中注意多给Android系统加大点缓存,有利于程序的调试。这个程序其实不太成熟,比如有写代码部分没有得到有力的简化。有不好的地方希望亲抽出时间发送消息哦,在下定感激不尽!






你可能感兴趣的:(Android)