Как использовать или отказаться в Android 12 SplashScreen

Новый API SplashScreen в Android 12 кажется хорошим, но, как и раньше, пример кода в документации не очень помогает объяснить всю правильную реализацию. Также есть некоторые случаи, когда вы можете выполнить какую-то задачу во время экрана-заставки, в нашем случае это запустить Firebase Auth, поэтому, вероятно, лучший способ - просто отказаться от использования этого нового избранного API, но, согласно предупреждению о линтах, кажется, что это обязательно и нет возможности отказаться.

Приложение не должно предоставлять собственный экран запуска.

Экран запуска, определяемый приложением Начиная с Android 12 (API 31+), экран запуска приложения предоставляется системой, и приложение не должно создавать свой собственный, иначе пользователь увидит два экрана-заставки. Пожалуйста, проверьте класс SplashScreen, чтобы проверить, как можно управлять и настраивать экран-заставку.

4 ответа

  1. Can we opt out of SplashScreen?

It looks like we can't opt out as Android Team is trying to unify the app loading experience: https://9to5google.com/2021/04/21/android-12-dp3-all-apps-now-show-the-same-splash-screen-while-loading-gallery/

  1. How to use it?

If you don't do anything then it will use windowBackground of the theme & your launcher icon & dismissed as soon as your app draws its first frame.

There are bunch of properties that you can modify like background, icon etc: https://developer.android.com/about/versions/12/features/splash-screen#set-theme

  1. What if I want splash to stay longer? Like checking in Network or DB for something.

You can use ViewTreeObserver.OnPreDrawListener & make a blocking call from your viewmodel return if it's ready to go ahead.

Activity:

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

You can read more about this: https://developer.android.com/about/versions/12/features/splash-screen#suspend-drawing

Чтобы дополнить ответ Маюра о поддержке старых устройств.

Новый windowSplashScreen* атрибуты необходимо добавить в res/values-v31/style.xml файл.

Тогда для устаревшего экрана-заставки это зависит от текущей реализации приложения.

Если приложение просто использует начальную тему с настраиваемой, делать нечего, поскольку она не используется для нового экрана-заставки (только если это простой цвет).

Если в приложении есть видимая заставка Activity, на Android 12 будет двойной экран-заставка. Чтобы решить эту проблему, приложение может перейти на windowBackground решение.

Если приложению действительно необходимо сохранить активность своего экрана-заставки, оно может обновить макет в соответствии с системным экраном-заставкой на Android 12 и / или создать плавный переход от экрана-заставки к экрану-заставке приложения с помощью SplashScreen.setOnExitAnimationListener()

Мы также можем использовать библиотеку заставок Android - ссылка

      android {
   compileSdk 31
   ...
}

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

Это даст параметры заставки в style.xml, вам просто нужно создать 2 style.xmls 1 для 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>

Узнайте больше об этой библиотеке на этом примере

вы можете добавить эту строку:

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

в вашем файле style.xml перед закрывающим тегом стиля. это сделает вашу заставку Android по умолчанию прозрачной!

Другие вопросы по тегам