对于旧设备的向后兼容性怎么处理?是否有任何codelab项目可供测试和玩耍?应用程序不应该提供自己的启动屏幕
应用程序定义的启动屏幕:从Android 12(API 31+)开始,应用程序的启动屏幕由系统提供,应用程序不应该创建自己的启动屏幕,否则用户将看到两个启动屏幕。请检查SplashScreen类以查看如何控制和自定义启动屏幕。
对于旧设备的向后兼容性怎么处理?是否有任何codelab项目可供测试和玩耍?应用程序不应该提供自己的启动屏幕
应用程序定义的启动屏幕:从Android 12(API 31+)开始,应用程序的启动屏幕由系统提供,应用程序不应该创建自己的启动屏幕,否则用户将看到两个启动屏幕。请检查SplashScreen类以查看如何控制和自定义启动屏幕。
看起来我们不能选择退出,因为安卓团队正在试图统一应用程序的加载体验: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
}
}
}
)
}
}
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
}
}
为了补充Mayur's answer,以支持旧设备。
需要在res/values-v31/style.xml
文件中添加新的windowSplashScreen*
属性。
对于传统的启动画面,取决于应用程序当前的实现方式。
如果应用程序只是使用具有自定义windowBackground
的启动主题,则无需进行任何操作,因为windowBackground
不用于新的启动画面(仅适用于简单颜色)。
如果应用程序有一些可见的启动画面Activity
,则在Android 12上会出现双重启动画面。要解决此问题,应用程序可以迁移到windowBackground
解决方案。
如果应用程序确实需要保留其启动画面Activity,则可以更新布局以匹配Android 12上的系统启动画面和/或使用SplashScreen.setOnExitAnimationListener()
创建平滑的过渡从系统启动画面到应用程序启动画面。
我们还可以使用安卓的启动画面库 - link
android {
compileSdk 31
...
}
dependencies {
...
implementation 'androidx.core:core-splashscreen:1.0.0-alpha02'
}
这将在 style.xml
中提供启动画面选项,您只需要创建两个 style.xml,一个用于 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>