热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

安卓自动登录demo——SharedPreferences的应用

SharedPreferences的应用SharedPreference的应用:有些时候,用于程序有少量的数据需要保存,这些数据的格式有很简单:字符串,基本类型变量的值等等。比如应用程序
SharedPreferences的应用

SharedPreference的应用:

有些时候,用于程序有少量的数据需要保存,这些数据的格式有很简单:字符串,基本类型变量的值等等。比如应用程序的各种配置信息,打开音效、是否引导界面、记住密码等等,对于这种数据,Android提供了SharedPreferences进行保存。


自动登录例子

效果图:

首次登录是第一张效果图,然后输入正确的账号和密码并自动登录是第二张效果图,登录之后进入第二个界面。退出程序,在次登录时是第三种图的效果,会自动进入第二个界面,然后点击取消自动登录之后,出现提示信息。在点击模拟器返回键或退出应用程序在次登录,则是最后一张图的效果。

                          


编程思路:


1,进入界面,从SharedPreferences中获得 记住密码的状态ischeck和自动登录isAuto。默认返回0
2,如果自动登录(isAuto==1),则启动线程,隐藏登录界面,显示自动登录,直接跳到第二个界面
3,如果记住了密码(ischeck==1),就在从SharedPreference中获取密码和账号并设置给控件,并设置复选框为选中状态。

4,添加自动登录和记住密码的监听器:若选择自动登录则记住密码也选中,

若在两者都选中的情况下取消记住密码则都取消

5,添加登录按钮监听器:判断账号密码不为空,在判断密码账号正确性:如果都成立,
//判断
(1)自动登录被选中:设置ischeck和isAuto为1,并记住密码
(2)只有记住密码被选中时,设置ischeck为1,并记住密码
(3)都未选中时,设置ischeck和isAuto为0。
跳转界面

否则,提示错误信息。


登录代码:

package bzu.hou.login;

import android.opengl.Visibility;
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.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.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class LoginActivity extends Activity {
/*
编程思路自然语言描述::
1,进入界面,从SharedPreferences中获得 记住密码的状态ischeck和自动登录isAuto。默认返回0
2,如果自动登录(isAuto==1),则启动线程,隐藏登录界面,显示自动登录,直接跳到第二个界面
3,如果记住了密码(ischeck==1),就在从SharedPreference中获取密码和账号并设置给控件,并设置复选框为选中状态。
4,添加自动登录和记住密码的监听器:若选择自动登录则记住密码也选中,若在两者都选中的情况下取消记住密码则都取消
5,添加登录按钮监听器:判断账号密码不为空,在判断密码账号正确性:如果都成立,
//判断
(1)自动登录被选中:设置ischeck和isAuto为1,并记住密码
(2)只有记住密码被选中时,设置ischeck为1,并记住密码
(3)都未选中时,设置ischeck和isAuto为0。
跳转界面
否则,提示错误信息。
*
*/
private EditText user,pass =null;
private CheckBox checkpass,auto_login =null;
private Button login =null;
private LinearLayout main =null;
private TextView auto =null;

private String str_user,str_pass =null;

private SharedPreferences shared =null;
private SharedPreferences.Editor editor =null;

private int isCheck =0; //是否记住密码 0默认 不记住
private int isAuto =0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);

InitView();
//
shared =this.getSharedPreferences("login", Context.MODE_PRIVATE);
editor =shared.edit();

isAuto =shared.getInt("auto", 0);
isCheck =shared.getInt("check",0); //刚进入界面获取 是否记住密码的状态

//自动登录
if(isAuto ==1){
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
main.setVisibility(View.GONE); //隐藏登录界面
auto.setVisibility(View.VISIBLE);//显示自动登录
Thread.sleep(2000);
Intent intent =new Intent(LoginActivity.this,TwoActivity.class);
startActivity(intent);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
//记住密码
if(isCheck==1){
//记住密码,从SharedPreferences中就获取账号密码
str_user =shared.getString("user", "");
str_pass =shared.getString("pass", "");
//设置给控件
user.setText(str_user);
pass.setText(str_pass);
//设置控件为选中状态
checkpass.setChecked(true);
}else {
//不记住密码
checkpass.setChecked(false);
}

//自动登录监听器
auto_login.setOnCheckedChangeListener(new OnCheckedChangeListener() {

@Override
public void onCheckedChanged(CompoundButton arg0, boolean bool) {
// TODO Auto-generated method stub
if(bool){//自动登录选中,记住密码也选中。
checkpass.setChecked(true);
}
}
});
//记住密码监听器
checkpass.setOnCheckedChangeListener(new OnCheckedChangeListener() {

@Override
public void onCheckedChanged(CompoundButton arg0, boolean bool) {
// TODO Auto-generated method stub
if(!bool){
auto_login.setChecked(false);
//防止 在正常登录后,在次进入登录界面时,只做了取消记住密码操作,而没有登录的情况。
editor.putInt("check",0);
editor.putInt("auto", 0);
editor.commit();
}
}
});
//登录事件
login.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if(isLogin()){//判断不为空
if(str_user.equals("123") && str_pass.equals("123")){//判断账号密码正确
//在登录时,判断控件是否记住密码,只有正确登录才能保存密码
if(auto_login.isChecked()){
editor.putInt("check",1);
editor.putInt("auto", 1);
editor.putString("user", str_user);
editor.putString("pass",str_pass);
}else if(checkpass.isChecked()){
editor.putInt("check",1);
editor.putString("user", str_user);
editor.putString("pass",str_pass);
}else {
editor.putInt("check",0);
editor.putInt("auto", 0);
}
editor.commit();
Intent intent =new Intent(LoginActivity.this,TwoActivity.class);
startActivity(intent);
}else {
Toast.makeText(LoginActivity.this, "账号或密码错误!", 3000).show();
}
}else {
Toast.makeText(LoginActivity.this, "账号或密码不能为空!", 3000).show();
}

}
});
}

private Boolean isLogin(){
str_user =user.getText().toString();
str_pass =pass.getText().toString();
if(str_user.equals("") || str_pass.equals(""))
return false;
return true;
}

private void InitView() {
// TODO Auto-generated method stub
user =(EditText)findViewById(R.id.user);
pass =(EditText)findViewById(R.id.pass);
login =(Button)findViewById(R.id.login);
checkpass =(CheckBox)findViewById(R.id.checkpass);
auto_login =(CheckBox)findViewById(R.id.auto_login);
auto =(TextView)findViewById(R.id.auto);
main =(LinearLayout)findViewById(R.id.mian);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.login, menu);
return true;
}

//在登录后,按下返回键
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
isAuto =shared.getInt("auto", 0);
main.setVisibility(View.VISIBLE);
auto.setVisibility(View.GONE);
if(isAuto==1){ //获得自动登录的状态,在界面二可能会改变
auto_login.setChecked(true);
}else {
auto_login.setChecked(false);
}
}


}

注意:
在取消记住密码时,要重新设置一下SharedPreferences,防止 在正常登录后,在次进入登录界面时,只做了取消记住密码操作,而没有登录的情况。
在按下返回键时,在代码中加入onRestart()方法,程序会自动回调此方法。

demo下载


推荐阅读
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • Android获取app应用程序大小的方法
    Android获取app应用程序大小的方法-Android对这种方法进行了封装,我们没有权限去调用这个方法,所以我们只能通过AIDL,然后利用Java的反射机制去调用系统级的方法。 ... [详细]
  • python+selenium十:基于原生selenium的二次封装fromseleniumimportwebdriverfromselenium.webdriv ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文整理了Java中org.gwtbootstrap3.client.ui.Icon.addDomHandler()方法的一些代码示例,展示了Icon.ad ... [详细]
  • 【爬虫】关于企业信用信息公示系统加速乐最新反爬虫机制
    ( ̄▽ ̄)~又得半夜修仙了,作为一个爬虫小白,花了3天时间写好的程序,才跑了一个月目标网站就更新了,是有点悲催,还是要只有一天的时间重构。升级后网站的层次结构并没有太多变化,表面上 ... [详细]
author-avatar
鱼mm不会游泳456
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有