Android用SharedPreferences实现登录注册注销功能
作者:袁小萌同学 发布时间:2023-03-24 21:50:10
标签:Android,登录,注册,注销
Android用SharedPreferences实现登录注册注销功能
前言
本文用SharedPreferences本地缓存账号信息来实现登录注册功能,以及退出注销功能。
一、本文逻辑
本文的注册登录逻辑如下:
1、注册页面:有账号可以直接去登录页面。没有账号的话填写账号密码,检测账号密码不为空,点击立即注册,保存账号信息,跳转到登录页面。
2、登录页面:首先读取缓存的账号密码和是否记住密码,将账号显示,判断记住密码的标志,为空或false,不显示密码,需要输入密码,为true则直接将缓存的密码显示,选择是否记住密码按钮,将此状态存入缓存,点击登录跳转到主页。
3、主页:首先取缓存,判断是否登录,若没有登录跳转到注册页面。点击退出登录,跳转到注册页;(2)点击注销账号,清除所有缓存,跳转到注册页面。
二、代码
1.布局界面
注册页面 activity_register.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#AB2196F3"
android:gravity="center"
android:text="用户注册"
android:textSize="20dp"
android:textStyle="bold" />
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="20dp"
android:orientation="vertical">
<EditText
android:id="@+id/reg_uname"
android:layout_marginTop="40dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:hint="帐号"/>
<EditText
android:id="@+id/reg_pwd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:inputType="textPassword"
android:hint="密码"/>
<EditText
android:id="@+id/reg_pwd2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:inputType="textPassword"
android:hint="再次确认密码"/>
<Button
android:id="@+id/register_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:background="#AB2196F3"
android:text="立即注册"/>
<Button
android:id="@+id/register_toLogin_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:background="#AB2196F3"
android:text="已有账号?去登录"/>
</LinearLayout>
</LinearLayout>
登录界面 activity_login.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#AB2196F3"
android:gravity="center"
android:text="用户登录"
android:textSize="20dp"
android:textStyle="bold" />
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="20dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:orientation="vertical">
<EditText
android:id="@+id/login_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:hint="账号"/>
<EditText
android:id="@+id/login_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="密码"
android:inputType="textPassword"
android:layout_margin="10dp"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp">
<CheckBox
android:id="@+id/login_remember"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="记住密码" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:clickable="true"
android:onClick="register"
android:textColor="#3F51B5"
android:text="没有账号?立即注册" />
</RelativeLayout>
<Button
android:id="@+id/login_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#AB2196F3"
android:text="登录"
android:layout_margin="10dp"/>
</LinearLayout>
</LinearLayout>
主页面
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="15dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="主页!"
android:textSize="30dp"
android:layout_centerHorizontal="true"
android:layout_alignParentTop="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="主页内容!"
android:textSize="30dp"
android:layout_marginTop="50dp"
android:layout_below="@id/text"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:text="退出登录"
android:layout_alignParentBottom="true"
android:onClick="Quit"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:text="注销此账号"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:onClick="zhuxiao"/>
</RelativeLayout>
2.Activity 逻辑
注册页面的逻辑
package com.example.yuan;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
/**
* Created by Yuan on 2020/8/6 17:08.
* 包名: com.example.yuan
* 类说明:注册(按钮的点击事件直接使用 Activity 作为事件 * )
*/
public class RegisterActivity extends AppCompatActivity implements View.OnClickListener {
//获取用户名,昵称,密码,确认密码
private EditText reg_uname,reg_uname2,et_pwd,et_pwd2;
//获取用户名,昵称,密码,确认密码的值
private String uname,pwd,pwd2;
private SharedPreferences sp;
private SharedPreferences.Editor editor;
private Button btn_reg,btn_toLogin;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
init();//获取界面控件
}
//UI组件初始化与事件绑定
private void init(){
//UI组件初始化
reg_uname=findViewById(R.id.reg_uname);
et_pwd=findViewById(R.id.reg_pwd);
et_pwd2=findViewById(R.id.reg_pwd2);
btn_toLogin=findViewById(R.id.register_toLogin_btn);
btn_reg=findViewById(R.id.register_btn);
//点击事件绑定
btn_reg.setOnClickListener(this);
btn_toLogin.setOnClickListener(this);
}
//点击事件
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.register_btn:
//获取参数
uname=reg_uname.getText().toString().trim();
pwd=et_pwd.getText().toString().trim();
pwd2=et_pwd2.getText().toString().trim();
//判断
if(uname.equals("") || pwd.equals("") ){
Toast.makeText(RegisterActivity.this, "用户名或密码不能为空", Toast.LENGTH_SHORT).show();
return;
}else if(!(pwd.equals(pwd2))){
Toast.makeText(RegisterActivity.this,"两次输入密码不一致",Toast.LENGTH_SHORT).show();
}else {
//loginInfo表示文件名
sp=getSharedPreferences("loginInfo", MODE_PRIVATE);
//获取编辑器
editor=sp.edit();
//存入注册的用户信息
editor.putString("username", uname);
editor.putString("password",pwd);
//提交修改
editor.commit();
Toast.makeText(RegisterActivity.this,"注册成功",Toast.LENGTH_SHORT).show();
startActivity(new Intent(getApplicationContext(),LoginActivity.class));
}
break;
case R.id.register_toLogin_btn://跳转到登录页面
startActivity(new Intent(getApplicationContext(),LoginActivity.class));
finish();
break;
}
}
}
登录页面的逻辑
package com.example.yuan;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
/**
* Created by Yuan on 2020/8/6 16:12.
* 包名: com.example.yuan
* 类说明:登录
*/
public class LoginActivity extends AppCompatActivity {
private EditText et_uname,et_upwd;//获取用户名,密码
private CheckBox isRemember;
private Button login_btn;
private String username,password,sp_name,sp_pwd;
private Boolean sp_isRemember;//是否记住密码的标志
private Context mContext;
private SharedPreferences sp;
private SharedPreferences.Editor editor;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
init();//获取界面控件
//读取缓存数据
sp=getSharedPreferences("loginInfo", MODE_PRIVATE);
sp_name=sp.getString("username","");
sp_pwd=sp.getString("password","");
sp_isRemember=sp.getBoolean("isRemember",false);
//如果有账号,直接显示
Log.d("TAG",sp_name);
et_uname.setText(sp_name);
//如果上次登录记住了密码,本次登录直接设置上
if(sp_isRemember.equals(true)){
et_upwd.setText(sp_pwd);
isRemember.setChecked(true);
}
mContext= LoginActivity.this;
//登录按钮的点击事件(直接用匿名内部类)
login_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//开始登录,获取输入的用户名和密码
username = et_uname.getText().toString().trim();
password = et_upwd.getText().toString().trim();
// TextUtils.isEmpty判断是否输入
if (TextUtils.isEmpty(username)) {
Toast.makeText(mContext, "请输入手机号", Toast.LENGTH_SHORT).show();
} else if (TextUtils.isEmpty(password)) {
Toast.makeText(mContext, "请输入密码", Toast.LENGTH_SHORT).show();
// 判断,输入的账号密码,是否与保存在SharedPreferences中一致
} else if (username.equals(sp_name) && password.equals(sp_pwd)) {
//一致登录成功
Toast.makeText(mContext, "登录成功", Toast.LENGTH_SHORT).show();
//判断记住密码按钮是否选中,选中则将isRemember设置为true,保存状态
sp=getSharedPreferences("loginInfo", MODE_PRIVATE);
//获取编辑器
editor=sp.edit();
if (isRemember.isChecked()) {//如果记住密码选中,存入true,否则存入false
editor.putBoolean("isRemember",true);
}else {
editor.putBoolean("isRemember",false);
}
editor.putBoolean("isLogin",true);//保存登录状态
editor.apply();//提交修改
//登录成功后关闭此页面进入主页
//跳转到主界面,登录成功的状态传递到 MainActivity 中
Intent intent=new Intent(getApplicationContext(),MainActivity.class);
intent.putExtra("name",username);
startActivity(intent);
finish();//销毁登录界面
} else if ((sp_pwd != null && !TextUtils.isEmpty(sp_pwd) && !password.equals(sp_pwd))) {
Toast.makeText(mContext, "输入的用户名和密码不一致", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(mContext, "此用户名不存在", Toast.LENGTH_SHORT).show();
}
}
});
}
//获取界面控件
private void init(){
et_uname=findViewById(R.id.login_username);
et_upwd=findViewById(R.id.login_password);
isRemember=findViewById(R.id.login_remember);
login_btn=findViewById(R.id.login_btn);
}
//注册按钮的点击事件(直接绑定在控件上)
public void register(View view) {
Intent intent=new Intent(getApplicationContext(),RegisterActivity.class);
startActivity(intent);
}
}
主页面的逻辑
package com.example.yuan;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private SharedPreferences sp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView=findViewById(R.id.text);
Intent intent=getIntent();
String name=intent.getStringExtra("name");
sp=getSharedPreferences("loginInfo", MODE_PRIVATE);
textView.setText("欢迎你,"+name);
Boolean isLogin=sp.getBoolean("isLogin",false);
if (!isLogin){
startActivity(new Intent(getApplicationContext(),RegisterActivity.class));
finish();
}else if(TextUtils.isEmpty(name)){
startActivity(new Intent(getApplicationContext(),LoginActivity.class));
finish();
}
}
public void Quit(View view) {
sp=getSharedPreferences("loginInfo", MODE_PRIVATE);
SharedPreferences.Editor editor=sp.edit();
editor.putBoolean("isLogin",false);
editor.commit();
startActivity(new Intent(getApplicationContext(),RegisterActivity.class));
finish();
}
/**
* @param view
*/
public void zhuxiao(View view) {
sp=getSharedPreferences("loginInfo", MODE_PRIVATE);
SharedPreferences.Editor editor=sp.edit();
editor.clear();
editor.commit();
Toast.makeText(MainActivity.this,"注销成功",Toast.LENGTH_SHORT).show();
startActivity(new Intent(getApplicationContext(),RegisterActivity.class));
finish();
}
}
来源:https://blog.csdn.net/dream_summer/article/details/107961655
0
投稿
猜你喜欢
- 1.情景展示java发送get请求、post请求(form表单、json数据)至另一服务器;可设置HTTP请求头部信息,可以接收服务器返回c
- 1.为什么要使用synchronized在并发编程中存在线程安全问题,主要原因有:1.存在共享数据 2.多线程共同操作共享数据。关键字syn
- 调用示例: 执行效果: 2.实现代码:/// <summary> 2 &
- 本文实例为大家分享了Android实现竖直跑马灯效果的具体代码,供大家参考,具体内容如下首先给出跑马灯效果图中间的色块是因为视频转成GIF造
- 前言:项目是c#的winform 写的,使用的播放器是基于AxWindowsMediaPlayer。AxWindowsMediaPlayer
- 本文实例为大家分享了C#实现简单的计算器功能的具体代码,供大家参考,具体内容如下环境:VS2010及以上版本1、建立个Window窗体应用2
- Parallel类是对线程的一个抽象。该类位于System.Threading.Tasks名称空间中,提供了数据和任务并行性。Paralle
- 目录前言I. 字符串转列表1. jdk支持方式2. guava方式3. apache-commonsII. 列表转字符串1. StringB
- Java * 代理设计模式定义:为其他对象提供一种代理以控制对这个对象的访问。 * 使用java * 机制以巧妙的方式实现了代理模式的
- 23种设计模式第十四篇:java迭代器模式定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。类型:行为类模式类图:如
- 实现说明这里的核心在于如何在大并发的情况下保证数据库能扛得住压力,因为大并发的瓶颈在于数据库。如果用户的请求直接从前端传到数据库,显然,数据
- 我们开发WinFrom程序,很多时候都希望程序只有一个实例在运行,避免运行多个同样的程序,一是没有意义,二是容易出错。为了更便于使用,笔者整
- 本文实例讲述了C#控制台下多线程实现方法。分享给大家供大家参考。具体如下:class Program{ static void
- 一、简介1.什么是GUID?全局唯一标识符(GUID,Globally Unique Identifier),GUID也称作 UUID(Un
- 面试题1:说说你对消息队列的理解,消息队列为了解决什么问题?我们公司业务系统一开始体量较小,很多组件都是单机版就足够,后来随着用户量逐渐扩大
- 项目背景:项目开发中数据库使用了读写分离,所有查询语句走从库,除此之外走主库。最简单的办法其实就是建两个包,把之前数据源那一套配置copy一
- Dubbo服务暴露机制前言在进行服务暴露机制的分析之前,必须谈谈什么是URL,在Dubbo服务暴露过程中URL是无处不在的,贯穿了整个过程。
- 详解HDFS多文件Join操作的实例最近在做HDFS文件处理之时,遇到了多文件Join操作,其中包括:All Join以及常用的Left J
- name和value属性的区别从源码可以得知,name是value的别名,value也是name的别名。两者的作用是一致的,name指定Fe
- 前言含义:(1)多重循环指一个循环语句的循环体中再包含循环语句,又称嵌套循环。(2)循环语句内可以嵌套多层循环。(3)不同的循环语句可以相互