【问题标题】:How to use or opt out in Android 12 SplashScreen如何在 Android 12 SplashScreen 中使用或退出
【发布时间】:2021-08-11 06:11:42
【问题描述】:

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

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

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

对于旧设备的向后兼容性如何,如何处理?有什么codelab项目可以玩和测试吗?

【问题讨论】:

    标签: android splash-screen android-12


    【解决方案1】:
    1. 我们可以选择退出 SplashScreen 吗?

    看起来我们无法选择退出,因为 Android 团队正在尝试统一应用加载体验: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
                        }
                    }
                }
            )
        }
    
    }
    

    视图模型:

    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

    【讨论】:

    • 是的,我以前读过这些,但是我们将如何处理这个问题以及对旧设备的支持?最好有一个代码实验室或示例项目来玩。
    【解决方案2】:

    补充 Mayur's answer 以获得旧设备支持。

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

    那么对于旧版启动画面,它取决于应用的当前实现。

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

    如果应用有一些可见的闪屏Activity,那么在Android 12 上会出现双闪屏。为了解决这个问题,应用可以迁移到windowBackground 解决方案。

    如果应用程序真的需要保留其启动屏幕 Activity,它可以更新布局以匹配 Android 12 上的系统启动屏幕和/或创建从系统启动屏幕到使用SplashScreen.setOnExitAnimationListener()的应用启动画面

    【讨论】:

    • 这种更新并没有受到很多人的欢迎,因为有些人不喜欢启动画面,因为其他情况完全没有必要。太糟糕了,这就是他们所做的,而不是使平台更稳定并减少分散的行为。统一 Android 在技术上是不可能的。
    【解决方案3】:

    我们也可以使用android的闪屏库-link

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

    这将在style.xml 中提供启动画面选项,您只需要为 android api 31 及以上版本和以下 api 31 之一创建 2 个 style.xmls 1

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

    使用example了解更多关于这个库的信息

    【讨论】:

    • 很遗憾,自从引入这个SplashScreen我和其他很多人都有这个问题:当应用程序从VS/Android Studio启动时,没有图标。更糟糕的是,如果在生产中应用程序是通过深层链接启动的,仍然没有图标,只是一个空白的启动屏幕。关于如何解决这个问题的任何想法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多