使用SplashScreen API时,如何在闪屏后动态选择启动目标Activity?
解决SplashScreen API下闪屏后跳转指定Activity的方案
核心思路:利用闪屏停留控制逻辑完成跳转判断
新的SplashScreen API默认会在installSplashScreen()后自动进入MainActivity,但可以通过控制闪屏的显示时长,在这段时间内完成"是否需要跳转其他页面"的判断,再决定后续行为。
具体实现方案
1. 用keepOnScreenCondition控制闪屏停留,异步完成判断
在MainActivity中,先初始化闪屏,再设置闪屏保持显示的条件,同时在后台执行跳转判断逻辑,完成后再结束闪屏并决定跳转或加载MainActivity内容。
class MainActivity : AppCompatActivity() { private var needToNavigate = false private val keepSplashOn = AtomicBoolean(true) override fun onCreate(savedInstanceState: Bundle?) { // 先安装闪屏,必须在super.onCreate之前 val splashScreen = installSplashScreen() super.onCreate(savedInstanceState) // 设置闪屏持续显示的条件 splashScreen.setKeepOnScreenCondition { keepSplashOn.get() } // 后台执行跳转判断逻辑(比如检查引导页状态、更新提示等) lifecycleScope.launch { needToNavigate = checkIfNeedJump() // 判断完成,结束闪屏 keepSplashOn.set(false) if (needToNavigate) { startActivity(Intent(this@MainActivity, TargetActivity::class.java)) finish() // 跳转后关闭MainActivity,避免返回键回到这里 } else { setContentView(R.layout.activity_main) // 正常加载主页面 } } } // 替换成你的实际判断逻辑,比如读取本地标记、接口请求结果 private suspend fun checkIfNeedJump(): Boolean { // 模拟异步操作,比如延迟1秒模拟接口请求 delay(1000) return true // 根据实际业务返回true/false } }
2. 监听闪屏退出动画,在动画结束后跳转(适合需自定义过渡的场景)
如果需要在闪屏退出动画完成后再执行跳转,可以通过setOnExitAnimationListener监听动画结束事件:
splashScreen.setOnExitAnimationListener { splashView -> if (needToNavigate) { startActivity(Intent(this@MainActivity, TargetActivity::class.java)) finish() } // 手动结束闪屏视图 splashView.remove() }
注意事项
- 耗时判断逻辑必须放在异步线程(协程、Handler、AsyncTask等),避免阻塞主线程导致ANR。
- 跳转后务必调用
finish()关闭MainActivity,防止用户按返回键回到未加载的MainActivity。 - 若判断逻辑是同步的(比如读取SharedPreferences的标记),可以直接执行判断,无需异步,但仍需保持闪屏停留逻辑的正确性。
内容的提问来源于stack exchange,提问作者amira
相关产品推荐
相关产品推荐

