Android实战-忘记密码案例

3 篇文章 0 订阅
订阅专栏

需求描述

在这里插入图片描述
各家电商App的登陆页面大同小异,要么是用户名与密码组合等等,要么是手机号码和验证码组合登录,若是做好一点的,则会提供找回密码与记住密码功能。先来看一下登录页面是什么样,因为有两种组合登陆方式,所以登陆页面页分成两个效果图。
在这里插入图片描述
在这里插入图片描述
从以上两个登录效果图可以看到,密码登录与验证码登录的界面主要存在一下几点区别:
(1)密码输入框和验证码输入框的左侧标题以及输入框内部的提示语各不相同。
(2)如果是密码登录,则需要支持找回密码。如果是验证码登录,则需要支持向用户手机发送验证码。
(3)密码登录可以提供记住密码的功能,而验证码每次的数值不一样,无需也没法记住验证码。
对于找回密码功能,一般直接跳到找回密码页面,在该页面输入和确认新的密码,并校验找回密码的合法性(通过短信验证码检查),据此勾勒出密码找回页面的轮廓概貌,如下图所示。
在这里插入图片描述
在找回密码的操作过程中,为了更好地增强用户体验,有必要在几个关键节点处提醒用户。比如发送成功验证码之后,要及时提示用户注意查收短信,这里暂且做成提醒对话框的形式。又比如密码登录成功之后,也要告知用户已经修改成功登录,注意继续后面的操作。
在这里插入图片描述
在这里插入图片描述

界面设计

	用户登录与找回密码界面看似简单,用到的控件却不少。大致从上到下、从左到右分布着下列Android控件。
	1.单选按钮RadioButton: 用来区分是密码登录和验证码登录。
	2.文本视图TextView: 输入框左侧要显示此处应该输入什么信息。
	3.编辑框EditText:用来输入手机号码、密码和验证码。
	4.复选框CheckBox:用于判断是否记住密码。
	5.按钮Button: 除了“登录”按钮,还要忘记密码和获取验证码两个按钮。
	6.线性布局LinearLayout:整体界面从上到下排列,用到了垂直方向的线性布局。
	7.相对布局:RelativeLayout:忘记密码按钮和密码输入框是叠加的。且“忘记密码”与上级视图右对齐。
	8.单选组RadioGroup:密码登录和验证码登录这两个单选按钮,需要放在单选组之中。
	9.提醒对话框AlertDialog:为了演示方便,获取验证码与登陆成功都通过提醒对话框向用户反馈结果。
	另外,整个登录模块是由登录页面和找回密码页面组成,因此这两个页面之间要进行数据交互,也就是在页面跳转之时传递参数。譬如,从登录页面跳到找回密码界面,要携带唯一地标识的手机号码作为请求参数,不然找回密码界面不知道要给哪个手机号码修改密码。同时,从找回密码页面回到登录页面,也要将修改之后的新密码作为应答参数传出去,否则登录页面不知道密码被改成什么了。

注意事项

在这里插入图片描述

在这里插入图片描述
](https://img-blog.csdnimg.cn/622f6839bd6a4f069310608a05eb309b.png)

ViewUtil.java

package com.example.retrievepassword.util;

import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;

public class ViewUtil {

    public static void hideAllInputMethod(Activity act) {
        // 从系统服务中获取输入法管理器
        InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm.isActive()) { // 软键盘如果已经打开则关闭之
            imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }

    public static void hideOneInputMethod(Activity act, View v) {
        // 从系统服务中获取输入法管理器
        InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
        // 关闭屏幕上的输入法软键盘
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
    }

}

action_login_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 android:padding="5dp">

 <RadioGroup
     android:id="@+id/rg_login"
     android:layout_width="match_parent"
     android:layout_height="50dp"
     android:orientation="horizontal"
     >

     <RadioButton
         android:id="@+id/rb_password"
         android:layout_width="0dp"
         android:layout_height="match_parent"
         android:layout_weight="1"
         android:checked="true"
         android:gravity="left|center"
         android:text="密码登录"
         android:textColor="@color/black"
         android:textSize="17sp"
         />

     <RadioButton
         android:id="@+id/rb_verifycode"
         android:layout_width="0dp"
         android:layout_height="match_parent"
         android:layout_weight="1"
         android:checked="false"
         android:gravity="left|center"
         android:text="验证码登录"
         android:textColor="@color/black"
         android:textSize="17sp"
         />
 </RadioGroup>

 <RelativeLayout
     android:layout_width="match_parent"
     android:layout_height="50dp">

     <TextView
         android:id="@+id/tv_phone"
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
         android:gravity="center"
         android:text="手机号码"
         android:textColor="@color/black"
         android:textSize="17sp"
         />

     <EditText
         android:id="@+id/et_phone"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_marginBottom="5dp"
         android:layout_marginTop="5dp"
         android:layout_toRightOf="@+id/tv_phone"
         android:background="@drawable/editable_selector"
         android:gravity="left|center"
         android:hint="请输入手机号码"
         android:inputType="number"
         android:maxLength="11"
         android:textColor="@color/black"
         android:textSize="17sp"
         android:textColorHint="@color/grey"
         />
 </RelativeLayout>

 <RelativeLayout
     android:layout_width="match_parent"
     android:layout_height="50dp">
     <TextView
         android:id="@+id/tv_password"
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
         android:gravity="center"
         android:text="登录密码:"
         android:textColor="@color/black"
         android:textSize="17sp"
         />

     <RelativeLayout
         android:id="@+id/et_password"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_marginBottom="5dp"
         android:layout_marginTop="5dp"
         android:background="@drawable/editable_selector"
         android:gravity="left|center"
         android:hint="请输入密码"
         android:inputType="numberPassword"
         android:maxLength="6"
         android:textColor="@color/black"
         android:textColorHint="@color/grey"
         android:textSize="17sp">

         <Button
             android:id="@+id/btn_forget"
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
             android:gravity="center"
             android:text="忘记密码"
             android:textColor="@color/black"
             android:textSize="17sp"
             />
     </RelativeLayout>
 </RelativeLayout>
 <CheckBox
     android:id="@+id/ck_remember"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:button="@drawable/checkbox_selector"
     android:checked="false"
     android:padding="10dp"
     android:text="记住密码"
     android:textColor="@color/black"
     android:textSize="17sp"
     />
 <Button
     android:id="@+id/btn_login"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:text="登录"
     android:textColor="@color/black"
     android:textSize="20sp"
     />

</LinearLayout>

LoginMainActivity.java

package com.example.retrievepassword;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.example.retrievepassword.util.ViewUtil;

import java.util.Random;

@SuppressLint("DefaultLocale")
public class LoginMainActivity extends AppCompatActivity implements View.OnClickListener {
  private RadioGroup rg_login;//声明一个单选组对象
  private RadioButton rb_password;//声明一个单选按钮对象
  private RadioButton rb_verifycode;//声明一个单选按钮按钮对象
  private EditText et_phone;//声明一个编辑框对象
  private TextView tv_password;//声明一个文本视图对象
  private EditText et_password;//声明一个编辑狂对象
  private Button btn_forget;//声明一个按钮控件对象
  private CheckBox ck_remember;//声明一个复选框对象

  private int mRequestCode = 0;//跳转页面时的请求常量
  private boolean isRemember = false;//是否记住密码
  private String mPassword = "111111";//默认密码
  private String mVerifyCode;//验证码

  @SuppressLint("WrongViewCast")
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_login_main);
      rg_login = findViewById(R.id.rg_login);
      rb_password = findViewById(R.id.rb_password);
      rb_verifycode = findViewById(R.id.rb_verifycode);
      et_phone=findViewById(R.id.et_phone);
      tv_password=findViewById(R.id.tv_password);
      et_password=findViewById(R.id.et_password);
      btn_forget = findViewById(R.id.btn_forget);
      ck_remember = findViewById(R.id.ck_remember);

      //设置监听器
      rg_login.setOnCheckedChangeListener(new RadioListener());//监听按钮组改变
      ck_remember.setOnCheckedChangeListener(new CheckListener());//监听记住密码复选框
      et_phone.addTextChangedListener(new HideTextWatcher(et_phone,11));//监听手机号码输入框的文本改变
      et_password.addTextChangedListener(new HideTextWatcher(et_password,6));//监听登录密码输入框的改变
      btn_forget.setOnClickListener(this);//监听忘记密码按钮的点击事件
      findViewById(R.id.btn_login).setOnClickListener(this);//监听登录按钮的点击事件

  }

  //定义登录方式的单选监听器
  private class RadioListener implements RadioGroup.OnCheckedChangeListener {
      @Override
      public void onCheckedChanged(RadioGroup group,int checkId) {
          if(checkId == R.id.rb_password) { //选择了密码登录
               tv_password.setText("登录密码: ");
               et_password.setHint("请输入密码");
               btn_forget.setText("记住密码");
               ck_remember.setVisibility(View.VISIBLE);
          } else if(checkId == R.id.rb_verifycode) {
              tv_password.setText("验证码:");
              et_password.setHint("请输入验证码:");
              btn_forget.setText("获取验证码:");
              ck_remember.setVisibility(View.GONE);
          }
      }
  }

  //定义是否记住密码的监听器
  private class CheckListener implements CompoundButton.OnCheckedChangeListener {
      @Override
      public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
          if(buttonView.getId() == R.id.ck_remember) {
              isRemember = isChecked;
          }
      }
  }

  //定义一个编辑框监听器,再输入文本达到指定长度时自动隐藏输入法
  private class HideTextWatcher implements TextWatcher {
      private EditText mView;//声明一个编辑框对象
      private int mMaxLength;//声明一个最大长度变量
      public HideTextWatcher(EditText v,int maxLength) {
          super();
          mView = v;
          mMaxLength = maxLength;
      }
      // 在编辑框的输入文本变化前触发
      public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

      // 在编辑框的输入文本变化时触发
      public void onTextChanged(CharSequence s, int start, int before, int count) {}

      // 在编辑框的输入文本变化后触发
      public void afterTextChanged(Editable s) {
         String str = s.toString();//获得已输入的文本字符串
          //输入文本达到11位(如手机号码)或者达到6位,如登录密码时关闭输入法
          if((str.length() == 11 && mMaxLength == 11) || (str.length() == 6 && mMaxLength == 6)) {
              ViewUtil.hideOneInputMethod(LoginMainActivity.this,mView);
          }
      }
  }

  @Override
  public void onClick(View v) {
      String phone = et_phone.getText().toString();
      if(v.getId() == R.id.btn_forget) //点击了忘记密码按钮
      {
          if(phone.length() < 11) {
              //手机号码长度不足11位
              Toast.makeText(this,"请输入正确的手机号",Toast.LENGTH_SHORT).show();
              return;
          }
          if(rb_password.isChecked()) {
              //选择了密码方式校验,此时要跳转到找回密码界面
              Intent intent = new Intent(this,LoginForgetActivity.class);
              intent.putExtra("phone",phone);
              startActivityForResult(intent,mRequestCode);//携带意图返回上一个页面
          } else if(rb_verifycode.isChecked()) {
              //选择了验证码方式校验,提示用户记住六位验证码数字
              AlertDialog.Builder builder = new AlertDialog.Builder(this);
              builder.setTitle("请记住验证码");
              builder.setMessage("手机号" + phone + "本次验证码是: " + mVerifyCode + ",请输入验证码!");
              builder.setPositiveButton("好的",null);
              AlertDialog alert = builder.create();
              alert.show();//显示提醒对话框
          }
      } else if(v.getId() == R.id.btn_login) {
          //点击了登录按钮
          if(phone.length() < 11) {
              //手机号码不足11位
              Toast.makeText(this,"请输入正确的手机号",Toast.LENGTH_SHORT).show();
          }
          if(rb_password.isChecked()) {
              //密码方式校验
              if(!et_password.getText().toString().equals(mPassword)) {
                  Toast.makeText(this,"请输入正确的密码",Toast.LENGTH_SHORT).show();
              } else {
                  //密码校验通过
                  loginSuccess();//提示用户登录成功
              }
          } else if(rb_verifycode.isChecked()) {
              //验证码方式校验
              if(!et_password.getText().toString().equals(mVerifyCode)) {
                  Toast.makeText(this,"请输入正确的验证码",Toast.LENGTH_SHORT).show();
              } else {
                  //验证码校验通过
                  loginSuccess();//提示用户登录成功
              }
          }
      }
  }

  //从下一个页面携带参数返回当前页面时触发
  @Override
  protected void onActivityResult(int requestCode,int resultCode,Intent data) {
      super.onActivityResult(requestCode,resultCode,data);
      if(requestCode == mRequestCode && data != null) {
          //用户密码已经改为新的密码,故更新密码变量
          mPassword = data.getStringExtra("new_password");
      }
  }

  //从修改密码页面返回登录页面,要清空密码的输入框
  @Override
  protected void onRestart() {
      super.onRestart();
      et_password.setText("");
  }

  //校验通过,登录成功
  private void loginSuccess() {
      String desc = String.format("您的手机号码是:%s,恭喜您通过登录验证,点击确定按钮返回上个页面",et_phone.getText().toString());
      //以下弹出提醒对话框,提示用户登录成功
      AlertDialog.Builder builder = new AlertDialog.Builder(this);
      builder.setTitle("登录成功");
      builder.setMessage(desc);
      builder.setPositiveButton("确定返回", new DialogInterface.OnClickListener() {
          @Override
          public void onClick(DialogInterface dialogInterface, int i) {
              finish();//结束当前活动页面
          }
      });

      builder.setNegativeButton("我再看看",null);
      AlertDialog alert = builder.create();
      alert.show();//显示提醒对话框
  }
}

activity_login_forget.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="50dp">
        <TextView
            android:id="@+id/tv_password_first"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="输入新密码:"
            android:textColor="@color/black"
            android:textSize="17sp"
            />
        <EditText
            android:id="@+id/et_password_first"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="5dp"
            android:layout_marginTop="5dp"
            android:layout_toRightOf="@+id/tv_password_first"
            android:background="@drawable/editext_selector"
            android:gravity="left|center"
            android:hint="请输入新密码"
            android:inputType="numberPassword"
            android:maxLength="11"
            android:textColor="@color/black"
            android:textColorHint="@color/grey"
            android:textSize="17sp"
            />
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="50dp" >

        <TextView
            android:id="@+id/tv_password_second"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="确认新密码:"
            android:textColor="@color/black"
            android:textSize="17sp" />

        <EditText
            android:id="@+id/et_password_second"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="5dp"
            android:layout_marginTop="5dp"
            android:layout_toRightOf="@+id/tv_password_second"
            android:background="@drawable/editext_selector"
            android:gravity="left|center"
            android:hint="请再次输入新密码"
            android:inputType="numberPassword"
            android:maxLength="11"
            android:textColor="@color/black"
            android:textColorHint="@color/grey"
            android:textSize="17sp" />
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="50dp" >

        <TextView
            android:id="@+id/tv_verifycode"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="  验证码:"
            android:textColor="@color/black"
            android:textSize="17sp" />

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_toRightOf="@+id/tv_verifycode" >

            <EditText
                android:id="@+id/et_verifycode"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginBottom="5dp"
                android:layout_marginTop="5dp"
                android:background="@drawable/editext_selector"
                android:gravity="left|center"
                android:hint="请输入验证码"
                android:inputType="numberPassword"
                android:maxLength="6"
                android:textColor="@color/black"
                android:textColorHint="@color/grey"
                android:textSize="17sp" />

            <Button
                android:id="@+id/btn_verifycode"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_alignParentRight="true"
                android:gravity="center"
                android:text="获取验证码"
                android:textColor="@color/black"
                android:textSize="17sp" />
        </RelativeLayout>
    </RelativeLayout>

    <Button
        android:id="@+id/btn_confirm"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="确  定"
        android:textColor="@color/black"
        android:textSize="20sp" />
</LinearLayout>

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="purple_200">#FFBB86FC</color>
    <color name="purple_500">#FF6200EE</color>
    <color name="purple_700">#FF3700B3</color>
    <color name="teal_200">#FF03DAC5</color>
    <color name="teal_700">#FF018786</color>
    <color name="colorPrimary">#008577</color>
    <color name="colorPrimaryDark">#00574B</color>
    <color name="colorAccent">#D81B60</color>
    <color name="black">#000000</color>
    <color name="white">#ffffff</color>
    <color name="grey">#cccccc</color>
</resources>

checkbox_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:drawable="@drawable/check_choose"></item>
    <item android:drawable="@drawable/check_unchoose"></item>
</selector>

editable_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:drawable="@drawable/shape_edit_focus"></item>
    <item android:drawable="@drawable/shape_edit_normal"></item>
</selector>

editext_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:drawable="@drawable/shape_edit_focus"></item>
    <item android:drawable="@drawable/shape_edit_normal"></item>
</selector>

shape_edit_focus.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#ffffff"/>
    <stroke android:width="1dp" android:color="#00ffff"/>
    <corners android:radius="5dp"/>
    <padding android:bottom="2dp" android:left="2dp" android:right="2dp" android:top="2dp"/>
</shape>

shape_edit_normal.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#ffffff"/>
    <stroke android:width="1dp"/>
    <corners android:radius="5dp"/>
    <pading android:bottom="2dp" android:left="2dp" android:right="2dp" android:top="2dp"/>
</shape>

利用共享参数实现记住密码功能

(1)声明一个共享参数对象,并在onCreate中调用getSharedPreferences方法获取共享参数的实例。
(2)登录成功时,如果用户勾选了“记住密码”,就使用共享参数保存手机号码与密码,也就是在loginSuccess方法中增加代码.


  // 校验通过,登录成功
  private void loginSuccess() {
      String desc = String.format("您的手机号码是%s,恭喜你通过登录验证,点击“确定”按钮返回上个页面",
              et_phone.getText().toString());
      // 以下弹出提醒对话框,提示用户登录成功
      AlertDialog.Builder builder = new AlertDialog.Builder(this);
      builder.setTitle("登录成功");
      builder.setMessage(desc);
      builder.setPositiveButton("确定返回", new DialogInterface.OnClickListener() {
          @Override
          public void onClick(DialogInterface dialog, int which) {
              finish(); // 结束当前的活动页面
          }
      });
      builder.setNegativeButton("我再看看", null);
      AlertDialog alert = builder.create();
      alert.show(); // 显示提醒对话框
      // 如果勾选了“记住密码”,就把手机号码和密码都保存到共享参数中
      if (isRemember) {
          SharedPreferences.Editor editor = mShared.edit(); // 获得编辑器的对象
          editor.putString("phone", et_phone.getText().toString()); // 添加名叫phone的手机号码
          editor.putString("password", et_password.getText().toString()); // 添加名叫password的密码
          editor.commit(); // 提交编辑器中的修改
      }
  }
逻辑漏洞——忘记密码、重置密码(案例分析、原理)
m0_61506558的博客
08-15 1527
输入手机号、获取短信验证码、输入错误的短信验证码1234后提交。那么,即便我没有短信验证码,通过将服务端下发给客户端的校验状态从“失败”改为“成功”也能成功重置找回账号密码。在第二步,校验短信验证码是否有效的结果应保存在服务端,某些网站未在服务端保存而是。,将服务端下发给客户端的校验状态 code 改为“0000”,可以重置其他用户密码。的状态(当然我们可以通过修改前端的代码让这个用户名变为可以修改的状态)那么,更改应答包中的状态值,可重置其他用户的密码。简单分析发现,校验通过时服务端并未向客户端。....
登录测试用例
Meng
09-02 3383
(4)中英文、特殊字符、空格、长度限制 - 一般情况下,登录账户和密码不允许输入中文。(6)同一用户在同一终端的多种浏览器上登录,验证登录功能的互斥性是否符合与其设计。(5)连续多次登录失败的情况下,系统是否会阻止后续的尝试以应对暴力破解。(5)验证码输入框内输入的验证码是否都可以在页面源码模式下被查看。(4)密码输入框内输入的密码是否都可以在页面源码模式下被查看。(4)不同浏览器、版本、分辨率下,显示和功能是否完整。(3)界面的文字是否简洁易懂,是否有错别字。(1)布局是否合理,输入框、按钮是否对齐。
账号密码注册登录忘记密码测试用例(挺详细的)
weixin_44764544的博客
12-14 6249
账号密码注册登录忘记密码测试用例
android 进程同步等问题
backer
05-31 940
写项目的时候需要实现登录并人脸认证的功能,但是登录的接口只有用户名和密码,登录成功返回重要信息flag,使用虹软的人脸识别。因此想的是先判断登录然后人脸认证。出现的问题是登录后进行人脸认证。登录部分是写在线程里的,如果返回的flag不为空,表明登录成功,可以进行人脸认证,否则弹出登录失败(写在catch中是,使用了loop)。因为登录部分写在线程中,所以一开始无论是否登录成功都会进行人脸认证(线程...
自定义View组合控件
weixin_30466039的博客
06-01 113
package com.example.myview_homework_demo;import android.annotation.SuppressLint;import android.content.Context;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.V...
Android-JAVA-案例-60全.zip
03-12
Android-JAVA-案例-60全
Android Layer-list编写实战(代码)
03-16
摘要:Java源码,Android,Android源码 Android Layer-list编写实战(代码),从一个Android编程实例包中摘出来的代码,层列表的运用Demo,同样是面向Android新手,有兴趣的请下载源码吧。
Android实战项目 - 购物商城
06-08
Android实战项目 - 购物商城
Android项目实战-订餐项目.zip
07-06
安卓网上订餐项目,实现订餐功能,也就是点外卖APP
Android | 常用控件的使用方法(一)
小旺的博客
03-30 821
TextView文本控件 <TextView android:id="@+id/text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:textSize="24sp" android:textColor="#03A9F4"
测试用例(注册、登陆和修改密码)
01-12
注册、登陆和修改密码测试用例范例
android如果跳过锁屏,安卓系统再曝漏洞:任何人都可轻松绕过锁屏密码
weixin_34416354的博客
05-29 7863
IT之家讯9月16日消息安卓最近频曝安全漏洞,不过大部分漏洞都比较隐晦,而且这些安全隐患需要入侵者具有足够的技术水平才能被利用,所以用户大面积中招的可能性不大。然而今天来自美国德克萨斯州一所大学的安全分析师发现的这个漏洞,仅需几步简单的操作就可以被利用,可谓门槛极低。据悉,这是一个和安卓系统锁屏界面有关的漏洞,广泛存在于Android 5.0及以上的系统版本,具体来说,用户只需要进行几步操作...
移动APP功能测试之登录、注册、忘记密码测试要点
iteye_14167的博客
03-08 2231
对于一款APP来说,登陆、注册、忘记密码三个功能,不管是对于用户还是对于APP本身都是最重要的,所以在做[url=https://www.testbird.com/quick-functional-testing/url]APP功能测试[/url]是对这三个功能也要特别注意 登录 登录模块比较简单,只有一个界面,侧重点在异常情况下报错信息的测试,思路主要是:类型、长度、空、...
忘记密码 重置密码实现总结
JamesPxy的专栏
03-01 4766
1.首先需要明确接口,确定找回密码流程以及各种存在的用例2.DigitsKeyListener 通过java代码来对TextView设置KeyListener KeyListener是一个接口,提供了对输入键盘按键的监听 InputFilter是一个接口,提供了对字符的过滤 android提供了实现了KeyListener和InputFilter的NumberKeyListener,而Dig
用账户名和密码登录测试用例
ZCYaiCLX3344的博客
03-17 6849
用账户名和密码登录测试用例
账号找回逻辑_【业务逻辑漏洞4】如何测试找回密码
weixin_39639965的博客
01-02 888
声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!常见的密码找回方式有:l邮箱找回l手机验证码找回l密码保护问题找回等这些常见的找回方式会存在哪些安全问题呢?今天主要来说说密码找回功能有哪些测试点及对应的测试方法。密码找回功能安全测试点,主要包含以下9个点:1.用户名枚举2.绕过密码找回步骤3.邮箱验...
忘记密码安全测试_“忘记我”和测试
danpu0978的博客
05-18 345
忘记密码安全测试 您的用户在您的Web应用程序上拥有个人资料。 通常,您应该给他们一种删除其个人资料的方法(至少这是欧洲法院的决定 )。 “简单”表示您需要一个/forget-me端点,该端点将删除当前用户的每条数据。 从数据库,文件存储,搜索引擎等。除了让用户至少部分控制自己的数据(是否可以决定是他们的决定)之外,这对开发人员也有好处。 除了包含大量模拟的孤立的单元测试之外,您还可以...
网页登陆界面,如何测试?
zj0910
10-19 3069
具体需求: 有一个登陆页面, (假如上面有2个textbox, 一个提交按钮。 请针对这个页面设计30个以上的test case.)   此题的考察目的: 面试者是否熟悉各种测试方法,是否有丰富的Web测试经验, 是否了解Web开发,以及设计Test case的能力   这个题目还是相当有难度的, 一般的人很难把这个题目回答好。   首先,你要了解用户的需求,比如这个登录界面
登录功能通用测试用例设计
weixin_30332241的博客
02-20 2048
登录功能通用测试用例 具体需求: 有一个登录页面,有一个账号和一个密码输入框, 一个提交按钮。 请针对这个页面设计Test Case。 此题的考察目的: 1、了解需求(测什么都是从了解需求开始); 2、是否有设计Test Case的能力 3、是否熟悉各种测试方法; 4、是否有丰富的Web测试经验; 5、是否了解Web开发; 了解需求: 测试需求分析过程,可以从质量要求出发,来展...
android studio登录页面跳转
最新发布
06-28
### 回答1: 在Android Studio中实现登录页面跳转,可以通过以下步骤实现: 1. 创建两个Activity,一个用于登录,一个用于跳转页面。 2. 在登录Activity中,添加一个按钮,当用户输入正确的用户名和密码后,点击按钮可以跳转到另一个Activity。 3. 在按钮的点击事件中,使用Intent对象来实现页面跳转。例如: ``` Intent intent = new Intent(LoginActivity.this, MainActivity.class); startActivity(intent); ``` 其中,LoginActivity.this表示当前Activity的上下文,MainActivity.class表示要跳转的Activity。 4. 在另一个Activity中,可以通过getIntent()方法获取传递过来的数据,例如: ``` Intent intent = getIntent(); String username = intent.getStringExtra("username"); ``` 其中,"username"是在登录Activity中传递过来的数据的键名。 通过以上步骤,就可以在Android Studio中实现登录页面跳转了。 ### 回答2: 在Android应用开发中,登录页面是所有应用中必不可少的一个部分,因为大多数应用都需要首先验证用户的身份才能开始使用应用的功能。当用户输入正确的用户名和密码后,应用需要将其重定向到主页面或某个特定页面。本文将介绍如何在Android Studio中实现登录页面跳转。 实现步骤: 1. 创建一个新的Android Studio项目,并创建登录页面。可以使用EditText和Button来创建登录框和登录按钮。 2. 在MainActivity.java文件中,创建一个方法用于检查用户输入的用户名和密码是否正确,如果正确则将用户重定向到主页面或某个特定页面。 3. 在AndroidManifest.xml文件中,将主要的Activity设置为登录页面,并添加需要的Activity和Intent Filter。 4. 在Android Studio中右键单击项目并选择“New->Activity”,根据需要添加其他相关Activity,例如用户登录后的主页面。 5. 使用Intent将用户从登录页面或其他Activity重定向到相关Activity。使用以下代码可以实现该目的: Intent intent = new Intent(MainActivity.this, HomePageActivity.class); startActivity(intent); 6. 若要在某个Activity中返回到登录页面,则应在该Activity中添加以下代码: Intent intent = new Intent(CurrentActivity.this, LoginActivity.class); startActivity(intent); finish(); 通过上述步骤,已经可以实现Android Studio中的登录页面跳转。其中最重要的部分是检查用户输入的用户名和密码是否正确,并使用Intent将用户重定向到相关Activity。如果需要在应用中添加其他功能,则需要添加额外的Activity和Intent Filter。最后,需要注意退出登录时的处理,以确保用户可以安全地使用应用。 ### 回答3: 在Android Studio中,要实现登录页面跳转通常需要使用Intent和startActivity()方法。 首先,我们需要在布局文件中设计好登录界面,包含用户名和密码的输入框、登录按钮以及考虑用户忘记密码的情况下的找回密码链接等。 接下来,需要对登录按钮添加点击事件,将用户输入的用户名和密码传递给后台服务器进行验证。如果验证通过,则跳转至主界面;如果验证失败,则提示用户输入错误。 在添加点击事件的部分,需要声明一个Intent对象并指定目标Activity。例如,我们可以在MainActivity里写以下代码: ```java //声明Intent对象,第一个参数是当前Activity.this,第二个参数是目标Activity的类名 Intent intent = new Intent(MainActivity.this, HomeActivity.class); //启动Activity startActivity(intent); ``` 其中,第二个参数“HomeActivity.class”表示跳转至名为HomeActivity的Activity。 此外,如果需要在跳转时传递额外的参数,也需要在Intent对象中进行设置。例如,我们可以使用以下代码在登录成功后将用户信息传递至主界面: ```java //声明Intent对象,第一个参数是当前Activity.this,第二个参数是目标Activity的类名 Intent intent = new Intent(MainActivity.this, HomeActivity.class); //向Intent中添加额外的参数,键和值都是字符串类型 intent.putExtra("username", "John"); intent.putExtra("age", "23"); //启动Activity startActivity(intent); ``` 然后在HomeActivity中通过以下代码获取传递过来的参数: ```java //获取Intent对象 Intent intent = getIntent(); //根据键名获取对应的值 String username = intent.getStringExtra("username"); String age = intent.getStringExtra("age"); ``` 需要注意的是,在进行页面跳转时还要考虑多个Activity之间的启动模式及其生命周期等问题,确保程序的正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • PV操作练习题 6264
  • 求解投骰子游戏问题 4803
  • 二叉树输出从根结点到值为x的结点的路径 4087
  • 求解幸运数问题 2457
  • Android实战-忘记密码案例 2408

分类专栏

  • 操作系统 3篇
  • 前端
  • 算法与数据结构 21篇
  • 高等数学 2篇
  • Android 3篇
  • JavaSE 2篇
  • 常识 1篇
  • 项目管理 1篇
  • JavaEE 2篇

最新评论

  • 求解旋转词问题

    李佩奇.: 没看懂表情包表情包

  • PV操作练习题

    m0_73759487: 把王道书上的东西搬过来又是一篇博客了表情包

  • PV操作练习题

    普通网友: 第一个例题解析有点笔误

  • 二叉树输出从根结点到值为x的结点的路径

    秋山玉佩: 第二种递归方法很精妙

  • 求解移动字符串问题

    m0_63573184: 博主,你是劳欢吗?

大家在看

  • FCP帆软交付工程师官网模拟题-SQL模块 1
  • 渗透测试基础(一) 243
  • 阿里云是什么
  • 开发扫码点餐小程序,让用餐更方便!
  • Opencv高级图像处理 446

最新文章

  • Linux常用命令总结
  • 在Linux上部署各种软件总结
  • Java实现基本排序算法汇总
2023年3篇
2022年16篇
2021年17篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃掉你的脑子·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

PHP网站源码内江百度网站优化报价坪山SEO按天计费推荐张家口建网站公司沧州百度竞价包年推广新余网站优化软件哪家好达州SEO按效果付费哪家好济南品牌网站设计多少钱黄南网站优化推广哪家好沙井seo网站推广价格常州SEO按天扣费价格延安网站建设设计价格铜川建站哪家好厦门百姓网标王推荐平凉seo价格赤峰seo网站优化哪家好清远网站搜索优化哪家好揭阳百度竞价哪家好六安外贸网站建设推荐大浪百度竞价龙岗网站优化软件报价桂林百搜标王报价漯河seo优化公司黄石网站优化推广多少钱宝鸡营销网站多少钱铁岭网站seo优化报价三明网站推广工具哪家好巴中网站关键词优化哪家好坪地seo排名南昌网站优化软件报价哈密网站搜索优化报价歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化