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

How to use or opt out in Android 12 SplashScreen

提问人:Bitwise DEVS 提问时间:5/22/2021 最后编辑:Bitwise DEVS 更新时间:8/30/2022 访问量:12151

问:

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

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

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

旧设备的向后兼容性如何,如何处理?是否有任何 Codelab 项目可供玩和测试?

初始屏幕 Android-12

评论


答:

7赞 Mayur Gajra 5/22/2021 #1
  1. 我们可以选择退出 SplashScreen 吗?

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

活动:

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

评论

0赞 Bitwise DEVS 5/22/2021
是的,我以前读过这些,但是我们将如何处理这个问题以及对旧设备的支持?最好有一个 Codelab 或示例项目来玩。
3赞 Andrew S 1/25/2022
哎呀,我认为如果谷歌把事情放在这个部门,让应用程序有更多的创作自由,那会更容易、更灵活。
5赞 Vadim Caen 5/27/2021 #2

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

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

然后,对于旧版初始屏幕,它取决于应用的当前实现。

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

如果应用程序有一些可见的启动画面,Android 12 上将有一个双启动画面。若要解决此问题,应用程序可以迁移到解决方案。ActivitywindowBackground

如果应用确实需要保留其初始屏幕 Activity,它可以更新布局以匹配 Android 12 上的系统初始屏幕和/或使用SplashScreen.setOnExitAnimationListener()

评论

1赞 Bitwise DEVS 5/28/2021
这种更新并没有受到许多人的欢迎,因为还有其他人不喜欢使用启动画面,因为其他情况完全没有必要。太糟糕了,这就是他们所做的,而不是使平台更稳定,行为更少碎片化。统一 Android 在技术上是不可能的。
1赞 Rahul Gaur 12/23/2021 #3

我们还可以使用 android 的启动画面库 - 链接

android {
   compileSdk 31
   ...
}

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

这将在 中提供初始屏幕选项,您只需要为 android api 31 及更高版本创建 2 个 style.xmls 1 个,以及 api 31 以下的一个style.xml

 <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赞 iBobb 1/19/2022
不幸的是,自从引入此 SplashScreen 以来,我和许多其他人都遇到了这个问题:当应用程序从 VS/Android Studio 启动时,没有图标。更糟糕的是,如果在生产环境中通过深层链接启动应用程序,仍然没有图标,只是一个空白的初始屏幕。关于如何解决这个问题的任何想法?
0赞 Rahul Gaur 1/21/2022
@iBobb我会检查您的问题,如果我找到解决方案,我会更新我的答案,如果您找到解决方案,您也可以更新我的答案。
0赞 Shokie Varun 8/30/2022 #4

您可以添加以下行:

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

在 style,.xml 文件中,在关闭样式标记之前。它使您的默认 Android Splash 透明!