启动页Activity未完成退出转场即结束,切换时出现启动器界面求助
首先明确一点:这既不是支持库的Bug,也不是说「启动后要结束的Activity」不能用转场——问题出在你的转场配置和调用时机上。
你遇到的核心问题是:启动页提前结束,导致转场动画还没完成,系统就把启动页从任务栈中移除,露出了后面的启动器界面。而finishAfterTransition()没生效,大概率是因为你没正确触发转场的完整流程。
关键的修复步骤
我给你拆解一下正确的操作流程:
确保转场特性已启用
不管是在代码里还是主题中,必须先开启Activity的转场支持:- 代码方式(在启动页和着陆页的
onCreate中,setContentView之前调用):getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS); - 主题方式(更推荐,避免重复代码):
在启动页和着陆页的主题中添加:<item name="android:windowContentTransitions">true</item>
- 代码方式(在启动页和着陆页的
用转场选项启动着陆页
不能用普通的startActivity(intent),必须搭配ActivityOptions来触发转场流程:Intent intent = new Intent(this, LandingActivity.class); // 创建转场动画选项,这里用你需要的滑动动画 ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this); startActivity(intent, options.toBundle());正确调用
finishAfterTransition()
一定要在startActivity之后调用这个方法,而且不能在启动页的生命周期早期(比如onCreate刚执行完)就立刻调用——要等启动页的核心逻辑(比如闪屏展示、初始化)完成后再触发。比如模拟闪屏延迟:new Handler(Looper.getMainLooper()).postDelayed(() -> { // 启动着陆页的代码 Intent intent = new Intent(this, LandingActivity.class); ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this); startActivity(intent, options.toBundle()); // 等待转场完成后再结束启动页 finishAfterTransition(); }, 2000);配置对应的转场动画
你可以在主题里直接指定进入/退出动画,或者用代码设置:// 启动页设置退出动画(向左滑动退出) getWindow().setExitTransition(new Slide(Gravity.START)); // 着陆页设置进入动画(向右滑动进入) getWindow().setEnterTransition(new Slide(Gravity.END));
为什么之前finishAfterTransition()没用?
finishAfterTransition()的作用是等待当前Activity的退出转场和目标Activity的进入转场都完成后,再结束当前Activity。但如果你的启动流程没有触发完整的转场(比如没加ActivityOptions、没开启转场特性),这个方法就会和普通的finish()一样立刻执行,自然无法解决问题。
额外注意点
- 如果你用的是AndroidX库,确保依赖的AppCompat库是较新版本(比如1.4.0以上),避免旧版本的小问题;
- 不要在启动页的
onResume之前就启动着陆页,否则可能干扰转场的生命周期; - 如果启动页是Launcher Activity,确保任务栈的配置正确(比如不要设置
android:noHistory="true",否则会提前结束)。
按照这个流程配置后,启动页会等着陆页的转场动画完全完成后才结束,就不会露出启动器界面了。
内容的提问来源于stack exchange,提问作者BadCode

