Android studio自动登录和记住密码的实现

news2024/11/15 21:43:21

Android studio自动登录和记住密码的实现


文章目录

  • Android studio自动登录和记住密码的实现
  • 前言
  • 一、效果
  • 二、设计思路
  • 三、知识点介绍
      • 1. SharedPreferenced
      • 2. checkButton就不介绍了
  • 四、自动登录及记住密码实现
  • 总结与补充


前言

大家好,我是oy,今天介绍一下在登录页面中如何实现自动登录及记住密码。


一、效果

在这里插入图片描述

二、设计思路

  1. 使用sharedPreferenced存储用户账号和密码,以及是否记住密码和自动登录。
  2. 记住密码和自动登录按钮都采用checkButton,使用checkButton的OnCheckedChangeListener监听。

三、知识点介绍

1. SharedPreferenced

  1. sharedPreferenced是Android中存储数据的一种方式。采用键值对的方式存储数据。

  2. 使用过程:
    ① 获取sharedPreferenced对象。
    ② 调用edit()获取SharePreferenced.Editor对象。
    ③ 调用putBoolean()…等向SharePreferenced.Editor对象添加数据。
    ④ 调用apply()提交数据。

  3. 例子

    // 存数据
    SharedPreferences sp = getSharedPrefrences("data", MODE_PRIVATE);// 获取sharedPreferenced对象
    SharedPreferences.Editor ed = sp.edit();// 获取SharePreferenced.Editor对象
    ed.putString("name", "Sam");// 向SharePreferenced.Editor对象添加数据
    ed.apply();// 调用apply()提交数据,就是保存的意思
    
    // 取数据
    SharedPrefrences sp = getSharedPrefrences("data",MODE_PRIVATE);
    String name = sp.getString("name","");// 取数据
    

2. checkButton就不介绍了

四、自动登录及记住密码实现

  1. 分为两个activity,mainActivity是登录页面,homeActivity是登录成功页面。
    HomeActivity.java代码

    public class HomeActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
      }
    }
    

    activity_home.xml代码

    	<?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout
    	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"
    	tools:context=".HomeActivity">
    
    	<TextView
        	android:id="@+id/tv_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/text"
        android:textSize="26sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    MainActivity.java代码

    	private AppCompatEditText edit_account,  edit_password;
    	private CheckBox cb_remember, cb_autologin;
    	private SharedPreferences sharedPreferences;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
        	super.onCreate(savedInstanceState);
        	setContentView(R.layout.activity_main);
        	bindView();
        	initView();
    	}
    
    	/**
     	*用于绑定控件id的方法
     	*/
    	protected void bindView() {
        	edit_account = findViewById(R.id.edit_account);
        	edit_password = findViewById(R.id.edit_password);
        	cb_remember = findViewById(R.id.cb_remember);
        	cb_remember.setOnCheckedChangeListener(this);
        	cb_autologin = findViewById(R.id.cb_autologin);
        	cb_autologin.setOnCheckedChangeListener(this);
        	Button btn_login = findViewById(R.id.btn_login);
        	btn_login.setOnClickListener(this);
        	// 获取SharedPreferences的实例
        	sharedPreferences = this.getSharedPreferences("loginInfo", MODE_PRIVATE);
    	}
    
    	/**
     	* 用于初始化界面
     	*/
    	protected void initView() {
    		// 获取sharedPreferences中remember对于的boolean值,true表示记住密码
        	if (sharedPreferences.getBoolean("remember", false)) {
            	cb_remember.setChecked(true);
            	edit_account.setText(sharedPreferences.getString("account", ""));
            	edit_password.setText(sharedPreferences.getString("password",""));
            	autologin();
        	}
    	}
    
    	// 登录按钮的逻辑
    	@Override
    	public void onClick(View view) {
        	// 定义账号和密码的字符串
        	String account, password;
        	// 判断账号是否为空
        	if (edit_account.getText() == null) {
            	showToast("账号为空,请重新输入");
            	return;
        	}
        	// 判断密码是否为空
        	if (edit_password.getText() == null) {
            	showToast("密码为空,请重新输入");
            	return;
        	}
        	// 账号和密码都不为空,进行密码账号校验
        	account = edit_account.getText().toString().trim();
        	password = edit_password.getText().toString().trim();
        	// 此处固定了账号和密码
        	if (account.equals("admin") && password.equals("12345")) {
            	if (cb_remember.isChecked()) {
                	SharedPreferences.Editor editor = sharedPreferences.edit();
                	editor.putString("account", account);
                	editor.putString("password", password);
                	editor.apply();
            	}
            	showToast("登录成功");
            	Intent intent = new Intent(MainActivity.this, HomeActivity.class);// 跳转到主界面
            	startActivity(intent);
    //            finish();
        	}
    	}
    
    	/**
     	* 自动登录逻辑
     	*/
    	private void autologin() {
        	// 获取sharedPreferences中autologin对于的boolean值, true表示记住密码
        	if (sharedPreferences.getBoolean("autologin", false)) {
            	// 勾选自动登录
            	cb_autologin.setChecked(true);
            	// 跳转页面
           		Intent intent = new Intent(MainActivity.this, HomeActivity.class);// 跳转到主界面
            	startActivity(intent);
        	}
    	}
    
    	/**
     	* 用于显示toast弹出消息
     	* @param text 需要显示的文本
     	*/
    	private void showToast(final String text) {
        	Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show();
    	}
    
    	// checkButton按钮的选中监听事件,compoundButton指的是checkButton控件, isChecked指的是是否勾选
    	@SuppressLint("NonConstantResourceId")
    	@Override
    	public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
        	switch (compoundButton.getId()) {
            	case R.id.cb_remember:
                	if (isChecked) {
                    	sharedPreferences.edit().putBoolean("remember", true).apply();
                	} else {
                    	sharedPreferences.edit().putBoolean("remember", false).apply();
                	}
                	break;
            	case R.id.cb_autologin:
                	if (isChecked) {
                    	sharedPreferences.edit().putBoolean("autologin", true).apply();
                	} else {
                    	sharedPreferences.edit().putBoolean("autologin", false).apply();
                	}
                	break;
        	}
    	}
    

    sharedPreferenced存储是位于data/data/包名/shared_prefs下。是xml文件存储键值对。
    比如

    <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
    <map>
    	<boolean name="remember" value="true" />
    	<boolean name="autologin" value="true" />
    	<string name="password">12345</string>
    	<string name="account">admin</string>
    </map>
    

总结与补充

主要介绍了在登录页面中如何实现自动登录和记住密码的功能,简单介绍了sharedPreferences的使用方法,这也是Android中存储数据常用的方法之一。Android存储还有sqlite数据库存储,在另一篇文章 " Android studio登录注册的实现及介绍 " 中有讲到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/657248.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅层神经网络

目录 1、神经网络表示 2、计算神经网络的输出 3、多个样本的向量化 4、激活函数 5、激活函数的导数 6、神经网络的梯度下降法 1、神经网络表示 输入层&#xff1a;有输入特征&#x1d465;1、&#x1d465;2、&#x1d465;3隐藏层&#xff1a;四个结点&#xff0c;表示你…

验证性实验 - 逻辑回归

练习2&#xff1a;逻辑回归 介绍 在本练习中&#xff0c;您将实现逻辑回归并将其应用于两个不同的数据集。还将通过将正则化加入训练算法&#xff0c;来提高算法的鲁棒性&#xff0c;并用更复杂的情形来测试模型算法。 在开始练习前&#xff0c;需要下载如下的文件进行数据上…

前端Vue非常简单实用商品分类展示组件 侧边商品分类组件

前端vue非常简单实用商品分类展示组件 侧边商品分类组件 &#xff0c; 下载完整代码请访问uni-app插件市场址:https://ext.dcloud.net.cn/plugin?id13084 效果图如下&#xff1a; #### 使用方法 使用方法 <!-- flist:第一级数组 slist&#xff1a;第二级数组 tlist&…

JS 介绍 Babel 的使用及 presets plugins 的概念

一、Babel 是什么 Bebal 可以帮助我们将新 JS 语法编译为可执行且兼容旧浏览器版本的一款编译工具。 举个例子&#xff0c;ES6&#xff08;编译前&#xff09;&#xff1a; const fn () > {};ES5&#xff08;编译后&#xff09;&#xff1a; var fn function() {}二、B…

NLP实战:使用Word2vec实现文本分类

目录 一、数据预处理 1、加载数据 2. 构建词典 3.生成数据批次和迭代器 二、模型构建 1.搭建模型 2.初始化模型 3.定义训练与评估函数 三、训练模型 1. 拆分数据集并运行模型 2. 测试指定数据 &#x1f368; 本文为[&#x1f517;365天深度学习训练营]内部限免文章&…

设计模式篇---单例模式

文章目录 概念结构与实现优缺点 概念 单例模式是结构最简单的设计模式&#xff0c;通过单例模式可以保证在整个系统中的一个类只有一个实例&#xff0c;从而节约系统资源。举个例子&#xff0c;比如windows电脑下的任务管理器只能打开一个&#xff0c;这个就是单例模式&#x…

【C语言进阶】程序员必备技能之文件操作

目录 &#x1f945;什么是文件&#xff1a; &#x1f3d1;程序文件&#xff1a;&#x1f3d1;数据文件&#xff1a; &#x1f3d1;文件名&#xff1a; &#x1f945;文件的打开和关闭&#xff1a;&#x1f3d1;文件指针&#xff1a; &#x1f3d1;fopen和fclose&#xff1a; &a…

genlogic GLG -CE 4.3 For Java/C#/C++ Crack

GLG CE工具包是一个极其灵活和强大的图形框架&#xff0c;用于构建显示实时数据的可视化界面&#xff0c;例如过程控制和监控的操作员显示、SCADA / HMI模拟和图表、 交通、遥测和网络监控显示&#xff0c;以及其他任务关键应用程序。 航电仪表板演示 该工具包包括 用于创建动…

面向对象三大特征

面向对象三大特征 众所周知&#xff0c;面向对象有三大特征 封装继承多态 封装继承多态&#xff0c;就好像武侠小说里的“金、木、水、火、土”一样&#xff0c;相生相克 封装 封装就像是武侠里的金钟罩铁布衫&#xff0c;把对象的数据和方法封装起来&#xff0c;对外只暴露…

C语言strstr函数的使用和模拟实现

strstr 函数原型&#xff1a; char *strstr( const char *string, const char *strCharSet );const char *string 要搜索的字符串const char *strCharSet 子串char *strstr 返回第一个出现字串的起始地址&#xff0c;方便函数链式访问 函数作用&#xff1a; 在 string 字符串…

逻辑越权之验证码|token|接口(36)

token是类似于会话一串数字代表数据包的唯一性&#xff0c;数据包的编号&#xff0c;防止一些csrf&#xff0c;或者一些存放数据包的攻击&#xff1b;一般数据包里面有token&#xff0c;就会检验数据包的唯一性&#xff0c;就会造成提交数据包&#xff0c;被token拦截掉。 验证…

第八章 图像压缩

文章目录 第八章 图像压缩8.1基础知识8.1.1 编码冗余8.1.4图像信息的度量8.1.5保真准则8.1.6图像压缩模型8.17图像格式、容器和压缩标准 8.2一些基本的压缩方法8.2.1霍夫曼编码8.2.2Golomb编码8.2.3算术编码8.2.4LZW编码8.2.5行程编码8.2.6基于符号的编码8.2.7比特平面编码8.2.…

JVM调优常用的工具JPS、JMAP、JSTAT、JSTACK和JCMD的使用详解

查看PID信息 首先启动一个服务 使用jps 和 jps -l 的区别&#xff0c;使用jps -l 能够显示出服务的名称 熟悉JVM调优中常用的工具JMAP、JSTAT和JSTACK JMAP、JSTAT和JSTACK是Java开发中常用的工具&#xff0c;用于分析和调试Java应用程序。它们的使用场景如下&#xff1a; JMA…

S7 1200 CM1241组态modbus rtu

S7 1200 V4.5版本 CM1241 V2.0版本 1 一开始遇到问题 CM1241 绿色灯一直闪烁, PLC 显示LED红色错误 网上查找可能固件不匹配 我一开始选的V2.2 最后选到V2.0才行 如果CM1241 绿灯变为常亮, 这样才是正确组态 如果不是常亮,那么是没有输出的 2 程序 弄了M1.0来启动配置m…

K-means算法

文章目录 1. K-means算法简介2. K-means算法原理2.1 算法具体步骤2.2 k取值方法2.2.1 手肘法2.2.2 轮廓系数法 2.3 K-means2.4 算法终止条件 3. K-means算法特点4. K-means算法应用场景5. K-means算法的Python应用5.1 K-means算法的Python实现5.2 sklearn.cluster.Kmeans函数的…

【Linux】timerfd——定时器

文章目录 前言认识 timerfdAPI timerfdAPI clock 官方示例简单使用epoll实现 前言 在 Linux 系统编程中&#xff0c;使用 timerfd 实现定时器功能是一种更加可靠、高效、灵活的方式。本文是对 timerfd 的简单使用&#xff0c;不涉及太过深入知识&#xff0c;熟练掌握几个常用 …

该死的科斯定理和三条保命原则

* * * 原创&#xff1a;刘教链 * * * 号外&#xff1a;今天在“刘教链”公众号次条发表了《内参&#xff1a;美联储下半年加息时间表和路径》&#xff0c;一号两文无法直接链接&#xff0c;请大家点击公众号卡片进入文章列表打开阅读。星球会员可以直接打开知识星球或discord …

企业级微服务架构实战项目--xx优选3-mq+nacos+es实现上下架

一 nacosmqes实现上下架 1.1 架构图 1.2 工程结构 1.3 核心代码流程 1.3.1 请求product模块 2.修改数据库&#xff0c;推送rabbitmq中 1.3.2 rabbitmq的工具类 1.3.3 search模块中rabbit客户端订阅信息 1.监听器监听信息 2.调用相应的上下架方法 2.1 调用product模块&…

c#网编实验五--WCF和TCP消息通信实验

分别编写服务端和客户端程序&#xff0c;利用基于WCF的TCP技术&#xff0c;实现在线聊天功能&#xff0c;完成在线用户列表管理&#xff0c;消息发送、接收的功能。 在同一个解决方案中&#xff0c;分别编写服务端程序和客户端程序&#xff0c;利用TCP实现简单的群聊功能。 具…

【领域驱动设计专题】一文带领你透视DDD领域驱动模型的本质和设计原理分析指南(构建领域知识)

一文带领你透视DDD领域驱动模型的本质和设计原理分析指南 前提介绍传统的软件设计方案瀑布设计方法敏捷方法学敏捷方法学的问题和局限性 构建领域知识认识和了解领域内容实体模型介绍分析飞行计划路线(route)路线(route) 领域专家进行交流&#xff0c;相互交换知识挖掘出关键的…