12

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

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

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

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

4

3 回答 3

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

}

视图模型:

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

于 2021-05-22T07:41:23.253 回答
4

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

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

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

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

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

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

于 2021-05-27T15:58:19.563 回答
1

我们也可以使用android的闪屏库——链接

android {
   compileSdk 31
   ...
}

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

这将提供初始屏幕选项style.xml,您只需要为 android api 31 及更高版本创建 2 style.xmls 1 和以下 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>

使用此示例了解有关此库的更多信息

于 2021-12-23T11:21:07.067 回答