为何入口Activity与非入口Activity的isFinishing()表现不同?
入口Activity与普通Activity的
isFinishing()行为差异解析 核心原因
Android系统对**入口Activity(需同时配置android.intent.action.MAIN和android.intent.category.LAUNCHER)**的返回键处理逻辑做了特殊设计:
- 普通Activity按返回键时,系统会直接执行
finish()流程,此时isFinishing()会被置为true,因此在onPause()中能拿到true结果。 - 入口Activity按返回键时,系统默认不会触发
finish(),而是将整个应用进程切换到后台(和按Home键的行为一致),因此isFinishing()始终为false。这种设计是为了优化用户体验——保留入口Activity实例,让用户下次启动应用时能快速恢复,无需重新创建。
验证方法
你可以在入口Activity中重写onBackPressed()手动触发finish(),就能看到isFinishing()的表现和普通Activity一致:
@Override public void onBackPressed() { super.onBackPressed(); // 手动调用finish(),isFinishing()会变为true finish(); }
区分返回键与Home键的替代方案
既然isFinishing()无法满足需求,推荐用以下两种方法区分:
- 重写
onBackPressed():只有返回键会触发这个方法,可在这里标记返回事件。 - 监听
onUserLeaveHint():Home键触发该方法,返回键不会(除非你在onBackPressed()中主动调用)。
示例代码:
private boolean isBackTriggered = false; @Override public void onBackPressed() { isBackTriggered = true; super.onBackPressed(); } @Override protected void onUserLeaveHint() { super.onUserLeaveHint(); if (!isBackTriggered) { // 这里处理Home键逻辑 Log.i(TAG, "Home键被按下"); } } @Override protected void onResume() { super.onResume(); // 每次恢复页面时重置标记 isBackTriggered = false; }
内容的提问来源于stack exchange,提问作者Cheok Yan Cheng
相关产品推荐
相关产品推荐

