提问人:Bitwise DEVS 提问时间:5/22/2021 最后编辑:Bitwise DEVS 更新时间:8/30/2022 访问量:12151
如何在 Android 12 SplashScreen 中使用或选择退出
How to use or opt out in Android 12 SplashScreen
问:
Android 12 中的新 API SplashScreen 看起来不错,但就像之前一样,文档中的示例代码并不能真正帮助解释整个和正确的实现。在某些情况下,您可能会在启动画面期间执行一些任务,在我们的例子中,这是启动 Firebase 身份验证,所以最好的方法可能是选择不使用这个新的特色 API,但根据 lint 警告,这似乎是强制性的,没有办法选择退出。
应用程序不应提供自己的启动屏幕
应用程序定义的启动屏幕从 Android 12 (API 31+) 开始, 应用程序的启动屏幕由系统和 应用程序不应创建自己的应用程序,否则用户将看到两个 初始屏幕。请检查 SplashScreen 类以检查如何 可以控制和自定义初始屏幕。
旧设备的向后兼容性如何,如何处理?是否有任何 Codelab 项目可供玩和测试?
答:
- 我们可以选择退出 SplashScreen 吗?
看起来我们无法选择退出,因为 Android Team 正在尝试统一应用加载体验:https://9to5google.com/2021/04/21/android-12-dp3-all-apps-now-show-the-same-splash-screen-while-loading-gallery/
- 如何使用它?
如果你不做任何事情,那么它将使用主题和你的启动器图标,并在你的应用程序绘制第一帧后立即关闭。windowBackground
您可以修改许多属性,例如背景,图标等:https://developer.android.com/about/versions/12/features/splash-screen#set-theme
- 如果我想让飞溅停留更长时间怎么办?就像获取本地数据库一样。
如果准备继续,您可以使用 & 从您的回货中拨打阻止电话。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
评论
补充 Mayur 对旧设备支持的回答。
需要在文件中添加新属性。windowSplashScreen*
res/values-v31/style.xml
然后,对于旧版初始屏幕,它取决于应用的当前实现。
如果应用程序只是使用带有自定义的起始主题,则无需执行任何操作,因为 不用于新的初始屏幕(仅当它是简单颜色时)。windowBackground
windowBackground
如果应用程序有一些可见的启动画面,Android 12 上将有一个双启动画面。若要解决此问题,应用程序可以迁移到解决方案。Activity
windowBackground
如果应用确实需要保留其初始屏幕 Activity,它可以更新布局以匹配 Android 12 上的系统初始屏幕和/或使用SplashScreen.setOnExitAnimationListener()
评论
我们还可以使用 android 的启动画面库 - 链接
android {
compileSdk 31
...
}
dependencies {
...
implementation 'androidx.core:core-splashscreen:1.0.0-alpha02'
}
这将在 中提供初始屏幕选项,您只需要为 android api 31 及更高版本创建 2 个 style.xmls 1 个,以及 api 31 以下的一个style.xml
<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 Splash 透明!
评论