Android 12下SplashScreen库启动页不显示及动画监听失效求助
问题分析与解决方案
核心问题点
- 回调逻辑冲突:同时使用
setKeepOnScreenCondition和setOnExitAnimationListener会触发逻辑矛盾——前者满足条件后会直接移除启动页,跳过后者的退出动画监听,这是你遇到回调被忽略的核心原因。 - 重新安装后的系统状态异常:应用处于前台时重新安装,Android系统启动流程会进入特殊状态,可能导致SplashScreen的生命周期回调未正常触发。
- 无效动画实现:你的退出动画是
ALPHA从1f到1f,无实际动画效果,且未在动画结束后调用splashScreenView.remove(),易引发视图残留或逻辑异常。 - 错误的跳转时机:在
setKeepOnScreenCondition回调中直接启动MainActivity并finish(),违背了该回调仅用于判断是否保持启动页显示的设计初衷,会导致逻辑混乱。
解决方案步骤
1. 移除冲突回调,聚焦退出动画逻辑
删除setKeepOnScreenCondition相关代码,仅通过setOnExitAnimationListener控制启动页退出与页面跳转。
2. 修复退出动画实现
设置有效的动画效果,并确保动画结束后正确移除启动页视图,再执行页面跳转。
3. 添加兜底逻辑,覆盖重新安装异常场景
在onResume中添加超时判断,防止因回调未触发导致应用卡在空白页。
4. 升级SplashScreen库版本
将依赖升级到最新稳定版(如androidx.core:core-splashscreen:1.0.1或更高),官方可能已修复重新安装场景下的兼容性问题。
修改后的代码示例
class SplashActivity : AppCompatActivity() { private var isMainActivityLaunched = false override fun onCreate(savedInstanceState: Bundle?) { // 必须在super.onCreate之前调用installSplashScreen val splashScreen = installSplashScreen() super.onCreate(savedInstanceState) splashScreen.setOnExitAnimationListener { splashScreenView -> // 设置渐隐退出动画 val fadeOut = ObjectAnimator.ofFloat( splashScreenView.iconView, View.ALPHA, 1f, 0f ) fadeOut.duration = 500L fadeOut.doOnEnd { splashScreenView.remove() // 必须移除启动页视图 launchMainActivity() } fadeOut.start() } } override fun onResume() { super.onResume() // 兜底逻辑:1.5秒内未启动MainActivity则直接跳转 if (!isMainActivityLaunched) { Handler(Looper.getMainLooper()).postDelayed({ if (!isMainActivityLaunched) { launchMainActivity() } }, 1500) } } private fun launchMainActivity() { if (!isMainActivityLaunched) { isMainActivityLaunched = true startActivity(Intent(this, MainActivity::class.java)) finish() } } }
额外注意事项
- 启动模式配置:确保
SplashActivity的启动模式为singleTask,避免重复创建实例(在AndroidManifest.xml中设置):<activity android:name=".SplashActivity" android:launchMode="singleTask" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> - 避免耗时操作:初始化逻辑建议放在
MainActivity或单独线程中,不要阻塞SplashScreen的生命周期回调。
内容的提问来源于stack exchange,提问作者LuzLaura98
相关产品推荐
相关产品推荐

