Android 12闪屏API不一致行为

ecbunoof  于 2023-11-15  发布在  Android
关注(0)|答案(1)|浏览(180)

我正在实现新的启动画面API,但遇到了不一致的行为。有时屏幕与应用程序图标显示,有时它不。还有一个长长的白色屏幕上的开始,这是明显恼人的(附件中的图像只是加快了3倍,因为我不能上传图像文件高于2MB在这里,但白色屏幕清晰可见了几秒钟,飞溅API似乎导致跳帧从编舞日志)。
三星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,如果出现问题,但同时启动画面将被保留,直到对话框被关闭。

uinbv5nw

uinbv5nw1#

我解决了这个问题,首先,如果你想在用户屏幕上保留启动图标屏幕,你需要同时使用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 { splashScreenViewProvider ->
                // Do nothing so the splash screen will remain visible
            }
        }

字符串
或只是

splashScreen.setOnExitAnimationListener {

            // Do nothing so the splash screen will remain visible
            splashScreenViewProvider = it

        }


然后在完成后调用splashScreenViewProvider.remove()
只要记住setKeepOnScreenCondition可以是一个UI阻塞线程,所以如果你在启动屏幕期间获取一些数据,并通过对话框,吐司或SnackBar显示错误消息,它就不会工作。你需要先将setKeepOnScreenCondition设置为false。
这里空setOnExitAnimationListener的作用是即使在setKeepOnScreenCondition上设置假条件后也不删除闪屏。

已关闭

如果你想控制和扩展闪屏,最好使用并清空setOnExitAnimationListener。然后保存它的splashScreenViewProvider在一个变量中,稍后通过调用remove()来控制或关闭屏幕。文档在这里。
由于热启动和冷启动的工作方式,有时飞溅标志可能不会显示。https://developer.android.com/develop/ui/views/launch/splash-screen#how
请注意,在Android Studio中直接使用USB调试安装和运行应用程序时仍然存在问题,其中SplashScreen从未显示并停留在空屏幕中,当您使用Firebase Test Lab时可能会出现问题。该问题仅发生在SDK 31和32中。
https://issuetracker.google.com/issues/197906327

相关问题