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

Android验证页面校验通过返回栈顶、按返回键退出全App的实现问题

Android PIN验证页双导航需求实现方案

核心实现逻辑

不需要给验证页的启动Intent添加FLAG_ACTIVITY_CLEAR_TASK,该标记会直接清空原有任务栈,导致PIN校验通过后无页面可回,完全不符合第一个需求。我们只需要将验证页作为普通Activity压入当前任务栈顶,通过区分两种退出场景分别处理即可。

单affinity场景实现

仅当应用所有页面都属于同一个affinity时,可直接用系统原生API实现:

  • PIN码校验通过后,直接调用finish()关闭验证页,系统会自动返回到任务栈中前一个存活页面,原有页面栈完全保留,满足第一个需求。
  • 重写验证页的返回键监听,触发时调用finishAffinity(),即可清空当前任务栈所有页面,直接退出应用,满足第二个需求。

示例代码:

class PinVerifyActivity : FragmentActivity() {
    // PIN校验成功回调
    fun onPinValid() {
        finish()
    }

    override fun onBackPressed() {
        finishAffinity()
        super.onBackPressed()
    }
}

多affinity场景实现

如果应用存在多个不同affinity的页面,finishAffinity()只能关闭当前affinity对应的任务栈,无法覆盖全应用页面,需通过全局Activity生命周期监听实现全应用关闭:

  1. 在Application中注册全局Activity生命周期回调,跟踪所有存活的Activity实例
  2. 触发全应用退出时,遍历所有存活Activity逐个关闭,最后杀掉应用进程

Application全局注册逻辑

class MyApplication : Application() {
    private val aliveActivityList = mutableListOf<Activity>()

    override fun onCreate() {
        super.onCreate()
        appInstance = this
        // 注册全局生命周期监听
        registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
            override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
                aliveActivityList.add(activity)
            }
            override fun onActivityDestroyed(activity: Activity) {
                aliveActivityList.remove(activity)
            }
            // 其余生命周期方法仅需空实现即可
            override fun onActivityStarted(activity: Activity) = Unit
            override fun onActivityResumed(activity: Activity) = Unit
            override fun onActivityPaused(activity: Activity) = Unit
            override fun onActivityStopped(activity: Activity) = Unit
            override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) = Unit
        })
    }

    // 全局退出方法
    fun exitAllProcess() {
        aliveActivityList.forEach { it.finish() }
        aliveActivityList.clear()
        System.exit(0)
    }

    companion object {
        lateinit var appInstance: MyApplication
    }
}

验证页调用逻辑

class PinVerifyActivity : FragmentActivity() {
    // PIN校验成功回调
    fun onPinValid() {
        finish()
    }

    override fun onBackPressed() {
        MyApplication.appInstance.exitAllProcess()
        super.onBackPressed()
    }
}

内容的提问来源于stack exchange,提问作者K.Os

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:57:05