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

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

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

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

对于旧设备的向后兼容性怎么处理?是否有任何codelab项目可供测试和玩耍?
4个回答

7
  1. 我们能选择退出启动画面吗?

看起来我们不能选择退出,因为安卓团队正在试图统一应用程序的加载体验:https://9to5google.com/2021/04/21/android-12-dp3-all-apps-now-show-the-same-splash-screen-while-loading-gallery/

  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
                    }
                }
            }
        )
    }

}

ViewModel:

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
    }
}

你可以阅读更多相关信息:https://developer.android.com/about/versions/12/features/splash-screen#suspend-drawing

是的,我之前看过那些内容,但我们如何与旧设备的支持一起处理呢?最好有一个代码实验室或示例项目来玩耍。 - Bitwise DEVS
3
我认为如果Google在这个部门放手一些,让应用程序拥有更多的创造自由,那么事情会更容易和灵活。 - Andrew S

5

为了补充Mayur's answer,以支持旧设备。

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

对于传统的启动画面,取决于应用程序当前的实现方式。

如果应用程序只是使用具有自定义windowBackground的启动主题,则无需进行任何操作,因为windowBackground不用于新的启动画面(仅适用于简单颜色)。

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

如果应用程序确实需要保留其启动画面Activity,则可以更新布局以匹配Android 12上的系统启动画面和/或使用SplashScreen.setOnExitAnimationListener()创建平滑的过渡从系统启动画面到应用程序启动画面。


1
这种更新并不受许多人的欢迎,因为有些人更喜欢没有启动画面,因为在其他情况下它是完全不必要的。太糟糕了,他们做的是这个,而不是使平台更稳定并减少碎片化行为。统一Android在技术上是不可能的。 - Bitwise DEVS

1

我们还可以使用安卓的启动画面库 - link

android {
   compileSdk 31
   ...
}

dependencies {
   ...
   implementation 'androidx.core:core-splashscreen:1.0.0-alpha02'
}

这将在 style.xml 中提供启动画面选项,您只需要创建两个 style.xml,一个用于 Android API 31 及以上版本,另一个用于 API 31 以下版本。

 <style name="Theme.CustomSplashScreenTheme" parent="Theme.SplashScreen">
    <item name="windowSplashScreenBackground">@color/white</item>
    <item name="windowSplashScreenAnimatedIcon">@drawable/logo</item>
    <item name="windowSplashScreenAnimationDuration">300</item>
    <item name="postSplashScreenTheme">@style/Theme.YourAppTheme</item>
</style>

使用示例了解更多关于这个库的信息。


4
很遗憾,自从引入了这个SplashScreen功能后,我和许多其他人都遇到了这个问题:当应用程序从VS/Android Studio启动时,没有图标。更糟糕的是,如果在生产环境中通过深度链接启动应用程序,仍然没有图标,只有一个空白的闪屏界面。有什么解决方法吗? - iBobb
@iBobb,我会检查您的问题,如果我找到了解决方案,我会更新我的答案。如果您发现了解决方案,也可以更新我的答案。 - Rahul Gaur

0

你可以添加这行代码:

          <item name="android:windowIsTranslucent">true</item>    

在样式文件(style.xml)中,在关闭样式标签之前加入以下内容。这将使您的默认 Android 启动画面透明!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接