如何以正确的方式制作启动画面,即不使其成为应用程序流程的一部分?

How to make a Splash screen the proper way i.e. not to make it a part of the app process?

我是 android 的新手。我想在我的应用程序中添加启动画面。我经历了这个 official documentation.

它说

When a user launches an app while the app's process is not running (a cold start) or the Activity has not been created (a warm start), the following events occur. (The splash screen is never shown during a hot start.) 1) The system shows the splash screen using themes and any animations that you've defined. 2) When the app is ready, the splash screen is dismissed and the app is displayed.

虽然将 activity 作为初始屏幕实现,但像下面给出的代码片段一样可以完成工作

class SplashScreenActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_splash_screen)

        supportActionBar?.hide()

        Handler(Looper.getMainLooper()).postDelayed({
            val intent = Intent(this, MainActivity::class.java)
            startActivity(intent)
            finish()
        }, 2000)
    }
}

但我想这不是传统方式,因为启动画面成为应用程序进程的一部分,它会在几毫秒长的黑屏后启动。

我想这是系统获取应用程序数据资源的时候,也是应该启动启动画面的时候,至少这就是 Google play storeWhatsapp 或所有其他已安装的应用程序,初始屏幕启动是即时的。

现在,正如文档坚持的那样,当我尝试设置主题属性时,我收到错误提示 Cannot resolve symbol 'android:windowSplashScreenBackground'。这是我的 style.xml

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <style name="Theme.Books" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <item name="colorPrimary">@color/purple_500</item>
        <item name="colorPrimaryVariant">@color/purple_700</item>
        <item name="colorOnPrimary">@color/white</item>
        <item name="colorSecondary">@color/teal_200</item>
        <item name="colorSecondaryVariant">@color/teal_700</item>
        <item name="colorOnSecondary">@color/black</item>
        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>

        <!-- Unresolved -->
        <item name="android:windowSplashScreenBackground">@color/black</item>
        <item name="android:windowSplashScreenAnimationDuration">1000</item>
        <item name="android:windowSplashScreenAnimatedIcon">@drawable/books_logo</item>
    
    </style>
</resources>

所以, 1。如何克服这个问题?

2。还有别的办法吗?

3。我错过了什么吗?有什么方法可以将 activity 从应用程序进程中分离出来吗?

感谢任何形式的帮助。谢谢!

你试过关注这篇文章吗?

Implementing Core Splashscreen API

我从教程中学到了什么:

您需要在 setContentView(R.id.***)

之前调用 installSplashScreen()

您需要修改 styles.xml 如文章所示,使用自定义 SplashScreen 属性(然后将 App Theme 设置为该属性)see here

只需删除您的 SplashScreenActivity,使用 Handler.postDelayed 也不是处理此问题的好方法(图书馆自己处理切换显示的内容,只需使用您的 MainActivity)