Android 12 启动画面 API 不一致的行为

Android 12 Splash Screen API inconsistent behavior

我正在实施新的启动画面 API 但遇到了不一致的行为。有时会显示带有应用程序图标的屏幕,有时不会。开头还有一个很长的白色屏幕,这明显很烦人(附加图像只是加速了 3 倍,因为我不能在这里上传大于 2mb 的图像文件,但是白色屏幕清晰可见几秒钟并且飞溅 API 似乎导致 Choreographer 日志跳帧)。

三星 J1 Android L

class LauncherActivity : AppCompatActivity() {

private var keepSplash = true

private lateinit var splashScreen: SplashScreen

override fun onCreate(savedInstanceState: Bundle?) {

        splashScreen = installSplashScreen().apply {
            // Behaves like observable, used to check if splash screen should be keep or not
            setKeepOnScreenCondition {
                keepSplash
            }
            setOnExitAnimationListener { sp ->
                sp.remove() // Remove splash screen
            }
        }

        super.onCreate(savedInstanceState)

}

fun fetchData() { 
   //Fetching network data... 
   keepSplash = false
}

显示 AlertDialog 似乎不起作用,除非我最小化应用程序并使用 setKeepOnScreenCondition 重新打开它。它似乎阻塞了 UI 线程,是否有其他方法可以保留启动画面而不是阻塞 UI 线程?目前,如果出现问题,我们需要显示一个 AlertDialog,但同时启动画面将保留,直到对话框被关闭。

我解决了这个问题,首先如果你想在用户屏幕上保留启动图标屏幕,你需要同时使用 setKeepOnScreenConditionsetOnExitAnimationListener

splashScreen.apply {
            // Behaves like observable, used to check if splash screen should be keep or not
            setKeepOnScreenCondition {
                keepSplash // True to keep the screen, False to remove it
            }
            setOnExitAnimationListener {
                // Do nothing so the splash screen will remain visible
            }
        }

请记住 setKeepOnScreenCondition 是一个 UI 阻塞线程,因此如果您在启动画面期间获取一些数据并通过对话框、Toast 或 SnackBar 显示错误消息,它将无法工作。您需要先将 setKeepOnScreenCondition 设置为 false。

这里emptysetOnExitAnimationListener的作用是即使在setKeepOnScreenCondition上设置了false条件也不会删除闪屏。