如何在 Android 12 SplashScreen 中使用或选择退出

Bit*_*EVS 6 android splash-screen android-12

Android 12 中的新 API SplashScreen看起来不错,但就像之前文档中的示例代码一样,并没有真正帮助解释整个正确的实现。在某些情况下,您可能会在启动画面期间执行某些任务,在我们的情况下,这是启动 Firebase Auth,因此最好的方法可能只是选择不使用这个新的特色 API,但根据 lint 警告,它似乎是强制性的并且没有办法选择退出。

应用程序不应提供自己的启动屏幕

应用程序定义的启动画面从 Android 12 (API 31+) 开始,应用程序的启动画面由系统提供,应用程序不应创建自己的启动画面,否则用户将看到两个启动画面。请检查 SplashScreen 类以检查如何控制和自定义启动画面。

旧设备的向后兼容性如何,如何处理?是否有任何代码实验室项目可以玩和测试?

May*_*jra 7

  1. 我们可以选择退出 SplashScreen 吗?

看来我们无法选择退出,因为 Android 团队正在尝试统一应用程序加载体验:https://9to5google.com/2021/04/21/android-12-dp3-all-apps-now-show-the -加载画廊时相同的启动画面/

  1. 如何使用它?

如果您不执行任何操作,那么它将使用windowBackground主题和您的启动器图标,并在您的应用程序绘制第一帧后立即关闭。

您可以修改许多属性,例如背景、图标等:https://developer.android.com/about/versions/12/features/splash-screen#set-theme

  1. 如果我想让水花停留更长时间怎么办?就像获取本地数据库一样。

如果准备好继续,您可以使用ViewTreeObserver.OnPreDrawListener并从您的返回中进行阻塞调用。viewmodel

活动:

// My Launcher Activity
class MainActivity : AppCompatActivity() {

    private val viewModel : JustDelayViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val content: View = findViewById(android.R.id.content)
        content.viewTreeObserver.addOnPreDrawListener(
            object : ViewTreeObserver.OnPreDrawListener {
                override fun onPreDraw(): Boolean {
                    // Check if the initial data is ready.
                    return if (viewModel.getIsReady()) {
                        // The content is ready; start drawing.
                        content.viewTreeObserver.removeOnPreDrawListener(this)
                        true
                    } else {
                        // The content is not ready; suspend.
                        false
                    }
                }
            }
        )
    }

}
Run Code Online (Sandbox Code Playgroud)

视图模型:

class JustDelayViewModel : ViewModel() {

    fun getIsReady(): Boolean {
        val result = viewModelScope.runCatching {
            runBlocking {
                //do some blocking call check for Firebase result or something
                delay(5000)
            }
            true //return the result
        }
        return result.isSuccess
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以阅读有关此内容的更多信息:https ://developer.android.com/about/versions/12/features/splash-screen#suspend-drawing

  • 哎呀,我认为如果谷歌只是把事情留在这个部门,让应用程序有更多的创作自由,事情会更容易、更灵活。 (3认同)

Vad*_*aen 5

补充Mayur对旧设备支持的答案。

需要将新windowSplashScreen*属性添加到res/values-v31/style.xml文件中。

然后,对于旧版启动画面,它取决于应用程序的当前实现。

如果应用程序只是使用带有自定义的起始主题,windowBackground则无需执行任何操作,因为该主题windowBackground不用于新的启动屏幕(仅当它是简单的颜色时)。

如果应用程序有一些可见的启动画面Activity,则在 Android 12 上将会出现双启动画面。要解决此问题,应用程序可以迁移到解决方案windowBackground

如果应用程序确实需要保持其启动屏幕 Activity,它可以更新布局以匹配 Android 12 上的系统启动屏幕和/或使用以下命令创建从系统启动屏幕到应用程序启动屏幕的平滑过渡SplashScreen.setOnExitAnimationListener()