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

问题描述 投票:0回答:4
Android 12 中的新 API

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

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

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

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

android splash-screen android-12
4个回答
7
投票
  1. 我们可以选择退出 SplashScreen 吗?
看来我们无法选择退出,因为 Android 团队正在尝试统一应用程序加载体验:

https://9to5google.com/2021/04/21/android-12-dp3-all-apps-now-show -加载画廊时相同的启动画面/

  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


5
投票
补充

Mayur 的答案,以支持旧设备。

需要在

windowSplashScreen*

 文件中添加新的 
res/values-v31/style.xml
 属性。

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

如果应用程序只是使用带有自定义

windowBackground

 的起始主题,则无需执行任何操作,因为 
windowBackground
 不用于新的启动屏幕(仅当它是简单颜色时)。

如果应用程序有一些可见的启动画面

Activity

,则在Android 12上将会出现双启动画面。要解决此问题,应用程序可以迁移到
windowBackground
解决方案。

如果应用程序

确实需要保持其启动屏幕 Activity,它可以更新布局以匹配 Android 12 上的系统启动屏幕和/或使用 SplashScreen.setOnExitAnimationListener() 创建从系统启动屏幕到应用程序启动屏幕的平滑过渡


    


1
投票
我们还可以使用android的闪屏库 -

link

android { compileSdk 31 ... } dependencies { ... implementation "androidx.core:core-splashscreen:1.0.1" }
这将在

style.xml

中提供启动屏幕选项,您只需为android api 31及以上版本和以下api 31之一创建2个style.xmls 1

<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>
使用此

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


0
投票
您可以添加这一行:

<item name="android:windowIsTranslucent">true</item>
在 style.xml 文件中关闭样式标签之前。它使您的默认 Android 启动画面变得透明!

© www.soinside.com 2019 - 2024. All rights reserved.