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
相关产品推荐
相关产品推荐

