Android——SharedPreferences实现登录界面的记住密码和自动登录功能
2015-06-06 08:04
896 查看
一、项目开发
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中设置文件布局,主要代码如下:
<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,代码如下:
<?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:<?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:
<?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文件中,那么代码部分如下:
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代码如下:
<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文件,代码部分如下:
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笔记(二十四):ServletContext1
- 在android工程中导入图片
- 无法打开Android SDK Manager的解决办法
- 菜鸟学Android笔记(二十三):ServletConfig
- android style 退出动画 解决退出动画无效问题
- android窗体动画:activity启动从底部向上滑动出现,关闭的时候从顶部向下滑动消失的动画实现
- 6.5android 自定义相机,以及部分手机系统相机的bug
- Android自定义控件
- Android实现QQ第三方登录
- Android应用之最新版本SDKV2.4实现QQ第三方登录
- Qt for android 截屏、Qml保存图片到本地
- Android学习日记(10)
- Android抽象布局——include、merge 、ViewStub .
- Android学习日记(9)
- Spinner的OnItemSelectedListener事件(在布局文件中通过Spinner的android:entries属性加载列表)
- Android中Menu的基本用法 .
- Android之drawable state各个属性详解 .
- 【Android】ListView 优化
- Android学习日记(8)
- android中的2种fragment部署方法