«

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

时间:2024-3-2 19:04     作者:韩俊     分类: Android


一、项目开发

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文件的形式保存在 <strong>/data/data/cn.edu.bzu.aminiTwitter/userInfo</strong>目录下。当系统以自动登录状态正确登录过一次之后,那么系统下一次登录就会自动调取数据进入ShowActivity.xml中。


二、开发Android-SharedPreferences程序讲解

1、项目文件如下:


2、项目开发步骤

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

[java] view
plaincopy

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&quot;
xmlns:tools="http://schemas.android.com/tools&quot;
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" >

&lt;RelativeLayout  
    android:id=&quot;@&#43;id/login_div&quot;  
    android:layout_width=&quot;wrap_content&quot;  
    android:layout_height=&quot;wrap_content&quot;  
    android:layout_margin=&quot;15dip&quot;  
    android:background=&quot;@drawable/background_login_div_bg&quot;  
    android:padding=&quot;2dp&quot;&gt;  

    &lt;TextView  
        android:id=&quot;@&#43;id/tvUserName&quot;  
        style=&quot;@style/normalText&quot;  
        android:layout_width=&quot;wrap_content&quot;  
        android:layout_height=&quot;wrap_content&quot;  
        android:layout_alignParentLeft=&quot;true&quot;  
        android:layout_alignParentTop=&quot;true&quot;  
        android:layout_marginTop=&quot;5dp&quot;  
        android:text=&quot;@string/tvUserName&quot; /&gt;  
    //用户名  
    &lt;EditText  
        android:id=&quot;@&#43;id/etName&quot;  
        android:layout_width=&quot;fill_parent&quot;  
        android:layout_height=&quot;wrap_content&quot;  
        android:layout_below=&quot;@&#43;id/tvUserName&quot;  
        android:hint=&quot;@string/tvUser_hint&quot;  
        android:background=&quot;@drawable/background_login_div_bg&quot;  
        android:inputType=&quot;text&quot;  
        android:singleLine=&quot;true&quot; &gt;  
    &lt;/EditText&gt;  

    &lt;TextView  
        android:id=&quot;@&#43;id/tvPasswordName&quot;  
        style=&quot;@style/normalText&quot;  
        android:layout_width=&quot;wrap_content&quot;  
        android:layout_height=&quot;wrap_content&quot;  
        android:layout_alignLeft=&quot;@&#43;id/etName&quot;  
        android:layout_below=&quot;@&#43;id/etName&quot;  
        android:layout_marginTop=&quot;5dp&quot;  
        android:text=&quot;@string/tvPasswordName&quot; /&gt;  
     //密码  
    &lt;EditText  
        android:id=&quot;@&#43;id/etPassword&quot;  
        android:layout_width=&quot;fill_parent&quot;  
        android:layout_height=&quot;wrap_content&quot;  
        android:layout_alignLeft=&quot;@&#43;id/tvPasswordName&quot;  
        android:layout_below=&quot;@&#43;id/tvPasswordName&quot;  
        android:ems=&quot;10&quot;  
        android:inputType=&quot;textPassword&quot;  
        android:background=&quot;@drawable/background_login_div_bg&quot;  
        android:password=&quot;true&quot;  
        android:singleLine=&quot;true&quot; /&gt;  
    //登录事件  
    &lt;Button  
        android:id=&quot;@&#43;id/btnName&quot;  
        android:layout_width=&quot;wrap_content&quot;  
        android:layout_height=&quot;wrap_content&quot;  
        android:layout_alignRight=&quot;@&#43;id/etPassword&quot;  
        android:layout_below=&quot;@&#43;id/etPassword&quot;  
        android:layout_marginTop=&quot;22dp&quot;  
        android:onClick=&quot;btnClick&quot;  
        android:background=&quot;@drawable/background_login&quot;  
        android:text=&quot;@string/btnName&quot; /&gt;  
    //多选框布局  
    &lt;LinearLayout   
        android:layout_width=&quot;wrap_content&quot;  
        android:layout_height=&quot;wrap_content&quot;  
        android:layout_alignBottom=&quot;@&#43;id/btnName&quot;  
        android:layout_alignLeft=&quot;@&#43;id/etPassword&quot;  
        android:orientation=&quot;horizontal&quot;&gt;  
    //记住密码  
    &lt;CheckBox  
        android:id=&quot;@&#43;id/cbJiYi&quot;  
        android:layout_width=&quot;wrap_content&quot;  
        android:layout_height=&quot;wrap_content&quot;  
        android:text=&quot;@string/cdJiYi&quot; /&gt;  
    //自动登录  
    &lt;CheckBox  
        android:id=&quot;@&#43;id/cbZiDongDengLu&quot;  
        android:layout_width=&quot;wrap_content&quot;  
        android:layout_height=&quot;wrap_content&quot;  
        android:text=&quot;@string/cbZiDongDengLu&quot; /&gt;  
    &lt;/LinearLayout&gt;  
&lt;/RelativeLayout&gt;  

&lt;RelativeLayout  
    android:layout_width=&quot;fill_parent&quot;  
    android:layout_height=&quot;fill_parent&quot; &gt;  

    &lt;TextView  
        android:id=&quot;@&#43;id/tvTiShiName&quot;  
        android:layout_width=&quot;wrap_content&quot;  
        android:layout_height=&quot;wrap_content&quot;  
        android:layout_alignParentLeft=&quot;true&quot;  
        android:layout_alignParentTop=&quot;true&quot;  
        android:layout_marginLeft=&quot;15dp&quot;  
        android:text=&quot;@string/tvTiShiName&quot;  
        android:textColor=&quot;#888&quot;  
        android:textColorLink=&quot;#FF0066CC&quot; /&gt;  
  &lt;ImageView  
        android:id=&quot;@&#43;id/dog_logo&quot;  
        android:layout_width=&quot;wrap_content&quot;  
        android:layout_height=&quot;wrap_content&quot;  
        android:layout_alignParentBottom=&quot;true&quot;  
        android:layout_alignParentRight=&quot;true&quot;  
        android:src=&quot;@drawable/dog&quot; /&gt;  
    &lt;ImageView  
        android:layout_width=&quot;wrap_content&quot;  
        android:layout_height=&quot;wrap_content&quot;  
        android:layout_alignBottom=&quot;@id/dog_logo&quot;  
        android:layout_toLeftOf=&quot;@&#43;id/dog_logo&quot;  
        android:paddingBottom=&quot;8dp&quot;  
        android:src=&quot;@drawable/bg&quot; /&gt;  

&lt;/RelativeLayout&gt;  

</LinearLayout>

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

[java] view
plaincopy

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

&lt;string name=&quot;app_name&quot;&gt;aminiTwitter&lt;/string&gt;  
&lt;string name=&quot;action_settings&quot;&gt;Settings&lt;/string&gt;  
&lt;string name=&quot;hello_world&quot;&gt;Hello world!&lt;/string&gt;  
&lt;string name=&quot;tvUserName&quot;&gt;账号:&lt;/string&gt;  
&lt;string name=&quot;tvUser_hint&quot;&gt;Email或手机号&lt;/string&gt;  
&lt;string name=&quot;tvPasswordName&quot;&gt;密码:&lt;/string&gt;  
&lt;string name=&quot;btnName&quot;&gt;登陆&lt;/string&gt;  
&lt;string name=&quot;tvTiShiName&quot;&gt;没有账号?&lt;a href=&quot;#&quot; nce_href=&quot;#&quot;&gt;注册&lt;/a&gt;&lt;/string&gt;  
&lt;string name=&quot;cdJiYi&quot;&gt;记住密码&lt;/string&gt;  
&lt;string name=&quot;cbZiDongDengLu&quot;&gt;自动登录&lt;/string&gt;  
&lt;string name=&quot;tvChengGong&quot;&gt;登录成功!&lt;/string&gt;  
&lt;string name=&quot;btnFanHui&quot;&gt;点击返回&lt;/string&gt;  
&lt;string name=&quot;title_activity_show&quot;&gt;MainActivity&lt;/string&gt;  

</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&quot; >
<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&quot; >
<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(&quot;userInfo&quot;, 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(&quot;abc&quot;) &amp;&amp; etPassword.getText().toString().equals(&quot;aaa&quot;)){  
        //如果选中记住密码  
        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&quot;
xmlns:tools="http://schemas.android.com/tools&quot;
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" />

&lt;/LinearLayout&gt;  

</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系统加大点缓存,有利于程序的调试。这个程序其实不太成熟,比如有写代码部分没有得到有力的简化。有不好的地方希望亲抽出时间发送消息哦,在下定感激不尽!

标签: android

热门推荐