Как использовать или отказаться в Android 12 SplashScreen
Новый API SplashScreen в Android 12 кажется хорошим, но, как и раньше, пример кода в документации не очень помогает объяснить всю правильную реализацию. Также есть некоторые случаи, когда вы можете выполнить какую-то задачу во время экрана-заставки, в нашем случае это запустить Firebase Auth, поэтому, вероятно, лучший способ - просто отказаться от использования этого нового избранного API, но, согласно предупреждению о линтах, кажется, что это обязательно и нет возможности отказаться.
Приложение не должно предоставлять собственный экран запуска.
Экран запуска, определяемый приложением Начиная с Android 12 (API 31+), экран запуска приложения предоставляется системой, и приложение не должно создавать свой собственный, иначе пользователь увидит два экрана-заставки. Пожалуйста, проверьте класс SplashScreen, чтобы проверить, как можно управлять и настраивать экран-заставку.
4 ответа
- 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/
- 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
- 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 по умолчанию прозрачной!