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

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

2015-06-08 10:41 996 查看


一、项目开发


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中设置文件布局,主要代码如下:

[java] view
plaincopy

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/LinearLayout1"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="@drawable/background_login"

android:orientation="vertical"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context=".MainActivity" >

<RelativeLayout

android:id="@+id/login_div"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_margin="15dip"

android:background="@drawable/background_login_div_bg"

android:padding="2dp">

<TextView

android:id="@+id/tvUserName"

style="@style/normalText"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:layout_alignParentTop="true"

android:layout_marginTop="5dp"

android:text="@string/tvUserName" />

//用户名

<EditText

android:id="@+id/etName"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_below="@+id/tvUserName"

android:hint="@string/tvUser_hint"

android:background="@drawable/background_login_div_bg"

android:inputType="text"

android:singleLine="true" >

</EditText>

<TextView

android:id="@+id/tvPasswordName"

style="@style/normalText"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignLeft="@+id/etName"

android:layout_below="@+id/etName"

android:layout_marginTop="5dp"

android:text="@string/tvPasswordName" />

//密码

<EditText

android:id="@+id/etPassword"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_alignLeft="@+id/tvPasswordName"

android:layout_below="@+id/tvPasswordName"

android:ems="10"

android:inputType="textPassword"

android:background="@drawable/background_login_div_bg"

android:password="true"

android:singleLine="true" />

//登录事件

<Button

android:id="@+id/btnName"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignRight="@+id/etPassword"

android:layout_below="@+id/etPassword"

android:layout_marginTop="22dp"

android:onClick="btnClick"

android:background="@drawable/background_login"

android:text="@string/btnName" />

//多选框布局

<LinearLayout

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignBottom="@+id/btnName"

android:layout_alignLeft="@+id/etPassword"

android:orientation="horizontal">

//记住密码

<CheckBox

android:id="@+id/cbJiYi"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/cdJiYi" />

//自动登录

<CheckBox

android:id="@+id/cbZiDongDengLu"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/cbZiDongDengLu" />

</LinearLayout>

</RelativeLayout>

<RelativeLayout

android:layout_width="fill_parent"

android:layout_height="fill_parent" >

<TextView

android:id="@+id/tvTiShiName"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:layout_alignParentTop="true"

android:layout_marginLeft="15dp"

android:text="@string/tvTiShiName"

android:textColor="#888"

android:textColorLink="#FF0066CC" />

<ImageView

android:id="@+id/dog_logo"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:layout_alignParentRight="true"

android:src="@drawable/dog" />

<ImageView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignBottom="@id/dog_logo"

android:layout_toLeftOf="@+id/dog_logo"

android:paddingBottom="8dp"

android:src="@drawable/bg" />

</RelativeLayout>

</LinearLayout>


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

[java] view
plaincopy

<?xml version="1.0" encoding="utf-8"?>

<resources>

<string name="app_name">aminiTwitter</string>

<string name="action_settings">Settings</string>

<string name="hello_world">Hello world!</string>

<string name="tvUserName">账号:</string>

<string name="tvUser_hint">Email或手机号</string>

<string name="tvPasswordName">密码:</string>

<string name="btnName">登陆</string>

<string name="tvTiShiName">没有账号?<a href="#" nce_href="#">注册</a></string>

<string name="cdJiYi">记住密码</string>

<string name="cbZiDongDengLu">自动登录</string>

<string name="tvChengGong">登录成功!</string>

<string name="btnFanHui">点击返回</string>

<string name="title_activity_show">MainActivity</string>

</resources>

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


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

background_login_div_bg.xml:

[java] view
plaincopy

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android" >

<solid android:color="#55FFFFFF"/>

<corners

android:topLeftRadius="10dp"

android:topRightRadius="10dp"

android:bottomRightRadius="10dp"

android:bottomLeftRadius="10dp"/>

</shape>

background_login.xml:

[java] view
plaincopy

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android" >

<gradient

android:startColor="#FFACDAE5"

android:endColor="#FF72CAE1"

android:angle="45"

/>

</shape>


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

[java] view
plaincopy

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代码如下:

[java] view
plaincopy

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#5C4033"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context=".ShowActivity" >

<LinearLayout

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="horizontal">

<TextView

android:id="@+id/tvChengGong"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/tvChengGong"

android:textColor="#00FF7F"

android:textSize="30sp" />

//返回

<Button

android:id="@+id/btnBack"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:onClick="Recover"

android:background="#00FF00"

android:text="@string/btnFanHui" />

</LinearLayout>

</RelativeLayout>



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

[java] view
plaincopy

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;

}

}


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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: