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生命周期监听实现全应用关闭:
- 在Application中注册全局Activity生命周期回调,跟踪所有存活的Activity实例
- 触发全应用退出时,遍历所有存活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
相关产品推荐
相关产品推荐

