移动技术开发:保存密码和自动登录

news2024/11/22 16:40:00

1 实验名称

       保存密码和自动登录

2 实验目的

       掌握利用SharedPreference实现记住密码和自动登录功能。

3 实验源代码

布局文件代码:

(1)activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<TableLayout 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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TableRow>
        <TextView
            android:text="账号"
            android:layout_marginRight="10dp"
            android:textSize="18sp"
            />
        <EditText
            android:id="@+id/userNameET"
            android:hint="请输入账号"
            />
    </TableRow>

    <TableRow>
        <TextView
            android:text="密码"
            android:layout_marginRight="10dp"
            android:textSize="18sp"
            />
        <EditText
            android:id="@+id/passWordET"
            android:hint="请输入密码"
            />
    </TableRow>

    <TableRow>
        <CheckBox
            android:id="@+id/savePwdCB"
            android:text="记住密码"
            />
        <CheckBox
            android:id="@+id/autoLoginCB"
            android:text="自动登录"
            />

        <Button
            android:id="@+id/loginBtn"
            android:text="登录"
            />
    </TableRow>


</TableLayout>

(2)activity_login_success.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".LoginSuccessActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="登录成功"
        />

</LinearLayout>

Java代码:

(1)MainActivity

package com.example.savelogininfotest;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class MainActivity extends AppCompatActivity {

    private EditText userNameET = null;
    private EditText passWordET = null;
    private CheckBox savePwdCB = null;
    private CheckBox autoLoginCB = null;
    private Button loginBtn = null;

    private String userName = null;
    private String userPwd= null;

    private SharedPreferences loginPreferences = null;
    private SharedPreferences.Editor loginEditor = null;

    private boolean isSavePwd = false;//用户是否选中记住密码的标志变量
    private boolean isAutoLogin = false;//用户是否选中自动登录的标志变量

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

        userNameET = findViewById(R.id.userNameET);
        passWordET = findViewById(R.id.passWordET);
        savePwdCB = findViewById(R.id.savePwdCB);
        autoLoginCB = findViewById(R.id.autoLoginCB);
        loginBtn = findViewById(R.id.loginBtn);

        loginBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //创建存取用户名和密码以及是否记住密码和是否自动登录的标志变量的编辑器
                loginEditor = loginPreferences.edit();
                userName = userNameET.getText().toString().trim();//获取用户输入的用户名
                userPwd = passWordET.getText().toString().trim();//获取用户输入的密码
                //编辑器将用户名和密码以键值对的方式封装
                loginEditor.putString("userName",userName);
                loginEditor.putString("userPwd",userPwd);

                //编辑器将是否记住密码和是否自动登录的值以键值对的方式封装
                loginEditor.putBoolean("isSavePwd",savePwdCB.isChecked());
                loginEditor.putBoolean("isAutoLogin",autoLoginCB.isChecked());

                loginEditor.commit();//将前面的四个键值对提交存放到本地文件中

                welcomeLoad();//调用跳转到登录成功页面的方法
            }
        });

        loginPreferences = getSharedPreferences("login", Context.MODE_PRIVATE);

        isSavePwd = loginPreferences.getBoolean("isSavePwd",false);
        isAutoLogin = loginPreferences.getBoolean("isAutoLogin",false);

        userName = loginPreferences.getString("userName",null);
        userPwd = loginPreferences.getString("userPwd",null);

        if (isAutoLogin){//判断用户上次是否选中了“自动登录”
            welcomeLoad();
        }else {
            loadLogin();
        }
    }

    //定义跳转到登录成功页面的方法
    private void welcomeLoad(){
        //跳转到“登录成功”
        Intent intent = new Intent(MainActivity.this, LoginSuccessActivity.class);
        startActivity(intent);
    }

    //定义登录方法
    private void loadLogin(){
        if (isSavePwd){//判断用户上次是否选中了“记住密码”
            userNameET.setText(userName);//将用户名填充到输入文本框
            passWordET.setText(userPwd);//将密码填充到输入文本框
            savePwdCB.setChecked(true);//将“记住密码”选择框勾选住
        }

        //为“自动登录”选择框添加事件监听
        autoLoginCB.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked){//如果勾选了“自动登录”
                    savePwdCB.setChecked(true);//将“记住密码”选择框勾选住
                }
            }
        });
    }
}

(2)LoginSuccessActivity

package com.example.savelogininfotest;

import android.os.Bundle;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class LoginSuccessActivity extends AppCompatActivity {

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

    }
}

4 实验运行结果图

5 实验总结

       同之前一样,先写布局文件,有两个布局文件,第一个布局文件是自动登录和记住密码的界面,输入账号和密码,选择记住密码、自动登录;第二个布局文件是登录后的界面,显示登录成功。

       写完布局文件,开始写Java代码。定义两个方法,一个是跳转到登录成功页面的方法,另一个是登录方法;创建存取用户名和密码以及是否记住密码和是否自动登录的标志变量的编辑器,编辑器将用户名和密码以及是否记住密码和是否自动登录以键值对的方式封装,并将这四个键值对提交存放到本地文件中;关于自动登录还有一个,那就是判断上次登录是否选择自动登录,如果没有选择,就显示登录界面,如果上次登录时选择了自动登录,那么新一次登录时将自动跳转到登录成功的界面;关于记住密码,如果用户上次选择了记住密码,呐用户名和密码将填充到文本输入框。

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

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

相关文章

【深度学习】经典的深度学习模型-02 ImageNet夺冠之作: 神经网络AlexNet

【深度学习】经典的深度学习模型-02 ImageNet夺冠之作: 神经网络AlexNet Note: 草稿状态&#xff0c;持续更新中&#xff0c;如果有感兴趣&#xff0c;欢迎关注。。。 0. 论文信息 article{krizhevsky2012imagenet, title{Imagenet classification with deep convolutional n…

智能巡检机器人与智慧运维系统的结合应用

一、传统配电运维的困境 传统配电运维面临诸多难题。首先&#xff0c;劳动强度大&#xff0c;运维人员需要手持终端设备对配电站室内环境、电气设备上的各个仪器仪表参量等进行定时巡视&#xff0c;工作繁琐且易疲劳。其次&#xff0c;效率低下&#xff0c;巡查间隔时间较长&a…

构建高效购物推荐系统:SpringBoot实战

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

2014年国赛高教杯数学建模D题储药柜的设计解题全过程文档及程序

2014年国赛高教杯数学建模 D题 储药柜的设计 储药柜的结构类似于书橱&#xff0c;通常由若干个横向隔板和竖向隔板将储药柜分割成若干个储药槽(如图1所示)。为保证药品分拣的准确率&#xff0c;防止发药错误&#xff0c;一个储药槽内只能摆放同一种药品。药品在储药槽中的排列…

前端开发攻略---前端ocr图片文字提取功能

1、引入资源 通过链接引用 <script src"https://cdn.bootcdn.net/ajax/libs/tesseract.js/5.1.0/tesseract.min.js"></script> npm或其他方式下载 npm i tesseract 2、示例 <!DOCTYPE html> <html lang"en"><head><meta…

手写mybatis之细化XML语句构建器,完善静态SQL解析

前言 1&#xff1a;在流程上&#xff0c;通过 DefaultSqlSession#selectOne 方法调用执行器&#xff0c;并通过预处理语句处理器 PreparedStatementHandler 执行参数设置和结果查询。 2&#xff1a;那么这个流程中我们所处理的参数信息&#xff0c;也就是每个 SQL 执行时&#…

RetinaNet 分类头和回归头的网络结构分析

RetinaNet 是由 Facebook AI Research&#xff08;FAIR&#xff09;在 2017 年提出的一种高效的一阶段&#xff08;one-stage&#xff09;目标检测算法。相比于两阶段&#xff08;two-stage&#xff09;方法&#xff0c;RetinaNet 通过引入 Focal Loss 解决了类别不平衡问题&am…

iOS 14 自定义画中画悬浮窗 Custom AVPictureInPictureController 实现方案

iOS 14&#xff0c;基于 AVPictureInPictureController&#xff0c;实现自定义画中画&#xff0c;涵盖所有功能与难点。 市面上的各种悬浮钟和提词器的原理都是基于此。 Demo源码在文末。 使用 iOS 画中画的要求&#xff1a; 真机&#xff0c;不能使用模拟器&#xff1b;iO…

SpringCloud-服务治理-Eureka

本篇是从基础方便讲解一些springcloud-服务治理-Eureka中的一些理论性的故事&#xff1b;具体的代码不详细展示&#xff1b;后面的文章会将源码进行整理&#xff0c;并且将源码的github地址上传。 1.什么是服务治理 专治分布式系统 (一)高可用性&#xff1a;服务治理框架保证…

高级IO之IO多路转接

高级I/O&#xff08;Advanced I/O&#xff09;是指在计算机系统中进行输入和输出操作时使用的一种更高级的接口和技术。也就是当我们进行输入输出的时候本质其实都要进行等待内核缓冲区中数据到来才能进行读取和写入到用户缓冲区。而往往在等待的阶段都是需要进行阻塞的。而高级…

React远程组件

什么是远程组件&#xff1f; 远程组件指的是从远程服务器动态加载的组件&#xff0c;这些组件可以是React、Vue等框架的组件。 为什么需要远程组件 本质上就是为了解决复用问题&#xff0c;那引出新的问题有几种公共项目代码复用方式&#xff1f; Git仓库 将公共代码单独抽…

【vue3】实现el-tree组件,将不同层级的箭头修改成自定义图标

效果图 <template><div class"menu"><div class"menu_list"><el-treeref"myTree":highlight-current"true":current-node-key"person.treeCheckedData"node-key"Id":default-expanded-keys&…

【AAOS】Android Automotive 11模拟器源码下载及编译

源码下载 repo init -u https://android.googlesource.com/platform/manifest -b android-11.0.0_r48 repo sync -c --no-tags --no-clone-bundle 源码编译 source build/envsetup.sh lunch car_x86_64-userdebug make -j12 运行效果 emualtor Home Map All apps Setting…

spring:springboot3使用Spring Security

介绍 Spring Security 是一个强大且高度可定制的安全框架&#xff0c;专为保护基于 Java 的应用程序而设计&#xff0c;尤其是 Spring 应用。它提供了一系列功能&#xff0c;帮助开发者实现身份验证&#xff08;Authentication&#xff09;、授权&#xff08;Authorization&am…

【C++】map和set的介绍以及用法

个人主页 文章目录 ⭐一、系列式容器和关联式容器&#x1f680;二、set的使用1. set类的介绍2. set的构造3. set的迭代器4. set的常用函数 &#x1f3a1;三、multiset&#x1f384;四、map类的使用1. map类的介绍2. map的构造3. map的迭代器4. map的operator[]5. map的常用函数…

Go语言中的控制结构(四)

Go语言中的控制结构详解 控制结构是编程语言中控制代码执行流程的核心部分&#xff0c;Go语言通过if、for、switch等常见的控制结构&#xff0c;以及独有的defer、panic、recover机制&#xff0c;提供了强大且简洁的控制流管理。本文将详细讲解Go语言中的控制结构&#xff0c;包…

第十四章 RabbitMQ延迟消息之延迟队列

目录 一、引言 二、死信队列 三、核心代码实现 四、运行效果 五、总结 一、引言 什么是延迟消息&#xff1f; 发送者发送消息时指定一个时间&#xff0c;消费者不会立刻收到消息&#xff0c;而是在指定时间后收到消息。 什么是延迟任务&#xff1f; 设置在一定时间之后才…

InfluxDB持久层封装

InfluxDB持久层封装 了解如何使用spring-boot来操作InfluxDB数据库&#xff0c;首先我们来看下整个的系统结构图例&#xff1a; 对比下mybatis中的执行流程&#xff1a; 1_自动装配 首先&#xff0c;我们来看下第一步自动装配&#xff1a;依赖spring-boot自动装配出InfluxDB对…

第十五届蓝桥杯C/C++学B组(解)

1.握手问题 解题思路一 数学方法 50个人互相握手 &#xff08;491&#xff09;*49/2 &#xff0c;减去7个人没有互相握手&#xff08;61&#xff09;*6/2 答案&#xff1a;1024 解题思路二 package 十五届;public class Min {public static void main(String[] args) {i…

实时从TDengine数据库采集数据到Kafka Topic

实时从TDengine数据库采集数据到Kafka Topic 一、认识TDengine二、TDengine Kafka Connector三、什么是 Kafka Connect&#xff1f;四、前置条件五、安装 TDengine Connector 插件六、启动 Kafka七、验证 kafka Connect 是否启动成功八、TDengine Source Connector 的使用九、添…