Android使用createConfirmDeviceCredentialIntent时返回键行为调整求助
解决PIN码认证界面按返回键直接关闭应用的问题
这个问题的核心是:当用户在PIN认证界面按下返回键时,系统会把RESULT_CANCELED的结果返回给调用认证Intent的Activity,默认情况下会回到这个Activity的界面。我们只需要在结果回调里捕获这个取消状态,主动关闭当前页面(或整个应用栈)即可。
下面给你两种适配不同开发模式的解决方案:
方案一:使用传统的startActivityForResult(适合旧版Android项目)
首先,在启动PIN认证Intent时,指定一个请求码:
private static final int REQUEST_CODE_PIN_AUTH = 1001; // 初始化并启动PIN认证Intent KeyguardManager keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Intent pinIntent = keyguardManager.createConfirmDeviceCredentialIntent("验证设备PIN码", "请输入PIN码以继续操作"); if (pinIntent != null) { startActivityForResult(pinIntent, REQUEST_CODE_PIN_AUTH); } }
然后重写onActivityResult方法,捕获取消状态并关闭应用:
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_PIN_AUTH) { if (resultCode == RESULT_CANCELED) { // 用户按返回键取消了认证,直接关闭当前Activity finish(); // 如果你的应用有多个Activity在栈中,需要关闭整个应用的话,可根据API版本选择下面的方法: // API 16+ 关闭所有同应用的Activity // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { // finishAffinity(); // } // API 21+ 移除整个任务栈,彻底关闭应用 // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // finishAndRemoveTask(); // } } else if (resultCode == RESULT_OK) { // PIN认证成功,执行你的业务逻辑 } } }
方案二:使用Jetpack Activity Result API(推荐新版Android项目)
Google现在推荐使用Activity Result API替代startActivityForResult,写法如下:
首先在Activity的onCreate方法中注册结果回调:
// 注册PIN认证的结果回调 ActivityResultLauncher<Intent> pinAuthLauncher = registerForActivityResult( new StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_CANCELED) { // 用户取消认证,关闭当前页面或整个应用 finish(); // 可选:关闭整个应用栈 // finishAffinity(); } else if (result.getResultCode() == RESULT_OK) { // 认证成功后的逻辑处理 } });
然后启动PIN认证Intent:
KeyguardManager keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Intent pinIntent = keyguardManager.createConfirmDeviceCredentialIntent("验证设备PIN码", "请输入PIN码以继续操作"); if (pinIntent != null) { pinAuthLauncher.launch(pinIntent); } }
原理说明
当用户在系统的PIN认证界面按下返回键时,系统会自动将RESULT_CANCELED作为结果返回给调用方Activity。我们通过监听这个结果,主动调用finish()(或栈关闭方法),就能实现直接关闭应用而不是回到主界面的需求。
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

