You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发中用户输入验证码验证通过后如何关闭对应视图页面?

锁屏密码验证功能修复方案

现有代码问题梳理

  • 逻辑颠倒:BaseActivity的requireCode()判断分支逻辑错误
  • 跳转错误:EnterCodeActivity的工厂方法写错了目标Activity类
  • 循环弹窗:没有防止重复启动的标记,onResume重复调用会多次触发锁屏页跳转
  • 可绕过验证:没有禁用锁屏页的返回键,用户可通过返回键跳过验证

代码修改步骤

1. 修改BaseActivity逻辑

补充防重复跳转标记,处理验证返回结果:

package com.mainapp.view.activity

open class BaseActivity: AppCompatActivity() {
    lateinit var repository: BasicRepository
    // 新增标记防止重复弹出验证页
    private var isVerifyingCode = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        pref = PreferenceManager(this)
        setupContentWindow()
    }

    fun setupContentWindow() {
        Helper.handleStatusBar(window, false, this)
    }

    override fun onResume() {
        super.onResume()
        // 只有需要验证、且当前不在验证流程中才启动锁屏页
        if (requireCode() && !isVerifyingCode) {
            isVerifyingCode = true
            val intent = EnterCodeActivity.intent(this, true)
            startActivityForResult(intent, Helper.REQUEST_CODE)
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == Helper.REQUEST_CODE) {
            isVerifyingCode = false
            // 验证不通过时直接退后台,避免用户绕过验证
            if (resultCode != RESULT_OK) {
                moveTaskToBack(true)
            }
        }
    }
}

2. 修改EnterCodeActivity逻辑

修复跳转错误,禁用返回键,补充错误输入后的清空逻辑:

package com.lockscreen.activity;

public class EnterCodeActivity extends AppCompatActivity {
    public static Intent intent(Context context, boolean requireCode) {
        // 修复目标类错误,改为当前EnterCodeActivity
        Intent intent = new Intent(context, EnterCodeActivity.class);
        intent.putExtra("REQUIRE_CODE", requireCode);
        return intent;
    }

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_enterpin);
       
        final CodeLockListener codeLockListener = new CodeLockListener() {

            @Override
            public void onComplete(String code) {
              checkCode(code);
            }

            @Override
            public void onEmpty() {
                Log.d(TAG, "Code empty");
            }
        };

        mCodeLockView = (CodeLockView) findViewById(R.id.codelockView);
        mIndicators = (Indicators) findViewById(R.id.indicators);

        mCodeLockView.attachIndicators(mIndicators);
        mCodeLockView.setCodeLockListener(codeLockListener);
        mIndicators.setIndicatorType(Indicators.IndicatorType.FILL_WITH_ANIMATION);
    }

    // 禁用返回键,防止用户绕过验证
    @Override
    public void onBackPressed() {
        // 不执行返回操作
    }

private void checkCode(String code) {
     APIManager.getInstance().verifyAuth(code, new Callback<String>() {
           @Override
           public void onResponse(Call<String> call, Response<String> response) {
               if (response.code() == 200) {
                   setResult(RESULT_OK);
                   // 直接关闭当前锁屏页,自动回到之前的业务页面
                   finish();
               } else {
                   mTextTitle.setText("Incorrect Code!");
                   // 清空输入框让用户重新输入
                   mCodeLockView.clearCode();
               }
           }

           @Override
           public void onFailure(Call<String> call, Throwable t) {
               mTextTitle.setText("Incorrect Code!");
               mCodeLockView.clearCode();
           }
       });
   }
}

可选拓展(切后台重验证)

如果需要实现应用切到后台再返回时重新验证密码,可在Application中注册全局生命周期监听,当所有Activity都退到后台时,重置密码验证状态标记,下次进入App就会重新触发验证。

内容的提问来源于stack exchange,提问作者14079_Z

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:09:04