Android12 新增SplashScreen,相关适配问题

这篇具有很好参考价值的文章主要介绍了Android12 新增SplashScreen,相关适配问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

从 Android 12 开始,在所有应用的冷启动和温启动期间,系统一律会应用 Android 系统的默认启动画面。默认情况下,此系统默认启动画面由应用的启动器图标元素和主题的 windowBackground(如果是单色)构成。

如果您不迁移自己的应用,那么该应用在 Android 12 及更高版本上的启动体验将会降级,也可能会产生意外结果:

如果您的现有启动画面是使用替换 android:windowBackground 的自定义主题实现的,那么在 Android 12 及更高版本上,系统会将自定义启动画面替换为默认的 Android 系统启动画面(这可能不是应用的预期体验)。

如果您的现有启动画面是使用专用 Activity 实现的,那么在搭载 Android 12 或更高版本的设备上启动您的应用会导致系统重复显示启动画面,也就是先显示新的系统启动画面,接着显示您现有的启动画面 activity。

在Android 12上已经默认使用了SplashScreen,如果没有任何配置,会自动使用App图标。
当然也允许自定义启动画面,在value-v31中的style.xml中,可以在App的主Theme中通过如下属性来进行配置:

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    <item name="android:windowSplashScreenBackground">@android:color/white</item>
    <item name="android:windowSplashScreenAnimatedIcon">@drawable/anim_ai_loading</item>
    <item name="android:windowSplashScreenAnimationDuration">1000</item>
    <item name="android:windowSplashScreenBrandingImage">@mipmap/brand</item>
</style>

windowSplashScreenBackground设置启动画面的背景色
windowSplashScreenAnimatedIcon启动图标。就是显示在启动界面中间的图片,也可以是动画
windowSplashScreenAnimationDuration设置动画的长度。注意这里最大只能1000ms,如果需要动画时间更长,则需要通过代码的手段让启动画面在屏幕上显示更长时间(下面会讲到)
windowSplashScreenIconBackground设置启动图标的背景色
windowSplashScreenBrandingImage设置要显示在启动画面底部的图片。官方设计准则建议不要使用品牌图片。

启动时长

默认当应用绘制第一帧后,启动画面会立即关闭。但是在我们实际使用中,一般在启动时进行一些初始化操作,另外大部分应用会请求启动广告,这样其实需要一些耗时的。通常情况下,这些耗时操作我们会进行异步处理,那么是否可以让启动画面等待这些初始化完成后才关闭?
我们可以使用 ViewTreeObserver.OnPreDrawListener让应用暂停绘制第一帧,直到一切准备就绪才开始,这样就会让启动画面停留更长的时间,如下:

...
var isReady = false
...

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main_activity)
    ...

    val content: View = findViewById(android.R.id.content)
    content.viewTreeObserver.addOnPreDrawListener(
        object : ViewTreeObserver.OnPreDrawListener {
            override fun onPreDraw(): Boolean {
                return if (isReady) {
                    content.viewTreeObserver.removeOnPreDrawListener(this)
                    true
                } else {
                    false
                }
            }
        }
    )
}

这样当初始化等耗时操作完成后,将isReady置为true即可关闭启动画面进入应用。
上面我们提到配置启动动画的时长最多只能是1000ms,但是通过上面的代码可以让启动画面停留更长时间,所以动画的展示时间也就更长了。

关闭动画

启动画面关闭时默认直接消失,当然我们也可以对其进行自定义。

在Activity中可以通过getSplashScreen来获取(注意判断版本,低版本中没有这个函数,会crash),然后通过它的setOnExitAnimationListener来定义关闭动画,如下:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    splashScreen.setOnExitAnimationListener { splashScreenView ->
        val slideUp = ObjectAnimator.ofFloat(
            splashScreenView,
            View.TRANSLATION_Y,
            0f,
            -splashScreenView.height.toFloat()
        )
        slideUp.interpolator = AnticipateInterpolator()
        slideUp.duration = 200L
        //这里doOnEnd需要Android KTX库,即androidx.core:core-ktx:1.7.0
        slideUp.doOnEnd { splashScreenView.remove() }
        slideUp.start()
    }
}

加上如上代码后,本来直接消失的启动画面就变成了向上退出了。
这里可以通过splashScreenView可以获取到启动动画的时长和开始时间,如下:

val animationDuration = splashScreenView.iconAnimationDurationMillis
val animationStart = splashScreenView.getIconAnimationStartMillis

这样就可以计算出启动动画的剩余时长。

低版本使用SplashScreen

只能在Android 12上体验官方的启动动画,显然不能够啊!官方提供了Androidx SplashScreen compat库,能够向后兼容,并可在所有 Android 版本上显示外观和风格一致的启动画面(这点我保留意见)。

首先要升级compileSdkVersion,并依赖SplashScreen库,如下:

android {
   compileSdkVersion 31
   ...
}
dependencies {
   ...
   implementation 'androidx.core:core-splashscreen:1.0.0-alpha01'
}

然后在style.xml添加代码如下:

<style name="Theme.App.Starting" parent="Theme.SplashScreen">
    // Set the splash screen background, animated icon, and animation duration.
    <item name="windowSplashScreenBackground">@android:color/white</item>

    // Use windowSplashScreenAnimatedIcon to add either a drawable or an
    // animated drawable. One of these is required.
    <item name="windowSplashScreenAnimatedIcon">@drawable/anim_ai_loading</item>
    <item name="windowSplashScreenAnimationDuration">1000</item>  # Required for
    # animated icons

    // Set the theme of the Activity that directly follows your splash screen.
    <item name="postSplashScreenTheme">@style/AppTheme</item>  # Required.
</style>

前三个我们上面都介绍过了,这里新增了一个postSplashScreenTheme,它应该设置为应用的原主题,这样会将这个主题设置给启动画面之后的Activity,这样就可以保持样式的不变。

注意上面提到的windowSplashScreenIconBackground和windowSplashScreenBrandingImage没有,这是与Android12的不同之一。
然后我们将这个style设置给Application或Activity即可:

<manifest>
   <application android:theme="@style/Theme.App.Starting">
    <!-- or -->
        <activity android:theme="@style/Theme.App.Starting">
...

最后需要在启动activity中,先调用installSplashScreen,然后才能调用setContentView,如下

class MainActivity : ComponentActivity() {

   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       val splashScreen = installSplashScreen()
       setContentView(R.layout.activity_main)
...

然后在低版本系统上启动应用就可以看到启动画面了。

installSplashScreen这一步很重要,如果没有这一行代码,postSplashScreenTheme就无法生效,这样启动画面后Activity就无法使用之前的样式,严重的会造成崩溃。比如在Activity中存在AppCompat组件,这就需要使用AppCompat样式,否则就会Crash。

现有启动画面迁移

目前市场上的App基本都自己实现了启动页面,如果直接添加SplashScreen,就会造成重复,所以我们需要对原有启动页面进行处理。具体处理还要根据每个App自己的启动页面的实现逻辑来定

不能通过Android 12设备提供的API直接禁用默认启动屏幕。

如果您的应用程序有一个自定义启动屏幕&您不想迁移到这种新的方法,您可以尝试下面的黑客。

基本上,您要做的是覆盖res\values-v31\themes.xml中的启动屏幕主题&设置一个透明的图标。

<style name="Theme.Splash" parent="Theme.Main">
    <item name="android:windowBackground">@color/background</item>
    <!-- 设置一个透明的图片icon -->
    <item name="android:windowSplashScreenAnimatedIcon">@drawable/transparent_image</item>
</style>

这将使你摆脱默认的应用程序图标,在应用程序启动时会出现。文章来源地址https://www.toymoban.com/news/detail-831905.html

到了这里,关于Android12 新增SplashScreen,相关适配问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android——8种通知栏-适配 Adnroid12

    GT库在很早的版本里就有出 通知栏封装方法,但使用起来非常有局限性,接下来咋们来看看新版GT库里的 8种通知栏 ,是如何实现的。 通知栏效果图:(博主真机 一加10T pro  Android版本12)         目录 通知栏效果图:(博主真机 一加10T pro  Adnroid版本12) 使用GT库里的,当然需

    2023年04月08日
    浏览(33)
  • Unity适配Android12所遇到的坑记录

    unity项目将targetSdk升级至32 遇到启动黑屏、热更新失效的问题 1、项目中舍弃了unity自带的splash(毕竟功能有限) 在Java层新加了SplashView Activity 升级到12后当需要切换到unity activity的时候,无法触发unity的OnApplicationPause以及OnApplicationFocus函数。 然后就无法执行后边的逻辑直接黑屏…

    2024年02月13日
    浏览(24)
  • 关闭 Android SplashScreen(闪屏)

    SplashScreen在Android 12上是强制的,如果你什么都不做,你的App在Android 12上就会自动拥有SplashScreen界面 但是这个SplashScreen界面太局限了能改的地方太少了 其实也没什么他主要作用是为了在App启动初始化的时候避免让用户在一个空白界面等待过长时间,一定程度上提升用户体验。

    2024年01月20日
    浏览(24)
  • Android 9.0 ota升级关于SettingsProvider新增和修改系统数据相关功能实现

      在9.0的系统rom定制化开发中,在进行ota升级的过程中,由于在SettingsProvider中新增了系统属性和修改某项系统属性值,但是在ota升级以后发现没有 更新,需要恢复出厂设置以后才会更改,但是恢复出厂设置 会丢掉一些数据,这是应为系统数据库没更新,所以需要在ota的时候

    2024年01月22日
    浏览(50)
  • Android 10.0 ota升级关于SettingsProvider新增和修改系统数据相关功能实现

      在10.0的系统rom定制化开发中,在进行ota升级的过程中,由于在SettingsProvider中新增了系统属性和修改某项系统属性值,但是在ota升级以后发现没有 更新,需要恢复出厂设置以后才会更改,但是恢复出厂设置 会丢掉一些数据,这是应为系统数据库没更新,所以需要在ota的时候

    2024年02月10日
    浏览(35)
  • android相机、相册相关(android13 适配)13又又又又又又搞事,让第三方难以生存,踩坑

    前几天公司开发的新项目要上线,结果...... 由于项目中有用户更换头像功能,应用市场经过检测android13无法更换头像,也没有崩溃也没有反应,所以App就被无情退回,相当无奈,那就查问题,手头有没有android13测试机,怎么办,怎么办,怎么办...那就想办法,还好vivo有云测

    2024年02月06日
    浏览(54)
  • Flutter层对于Android 13存储权限的适配问题

    感觉很久没有写博客了,不对,的确是很久没有写博客了。原因我不怎么想说,玩物丧志了。后面渐渐要恢复之前的写作节奏。今天来聊聊我最近遇到的一个问题: Android 13版本对于storage权限的控制问题。 我们都知道,Android的每个版本更新都会伴随着搞事,也就是所谓的谷

    2024年02月07日
    浏览(31)
  • Unity 导出android后android12以上黑屏问题

    其实这个是前两年就遇到过的问题。 基本上是权限问题引起的。 android10以上手机是需要手动获取一些敏感权限,unity2018以前的版本没有适配,导出的android工程在没有手动获取权限的情况下会黑屏卡住。 那么需要哪些权限呢? 那就是【READ_PHONE_STATE】 ,在androidmanifest里添加这

    2024年02月11日
    浏览(28)
  • 《Android学习笔记》Android12蓝牙扫描不到设备的权限问题

    Android12 关于蓝牙这部分新增了 BLUETOOTH_SCAN 、 BLUETOOTH_ADVERTISE 和 BLUETOOTH_CONNECT 权限,这些权限都属于敏感权限,都需要在代码中动态申请。移除了Android11 及以下版本中必须申请的位置权限[ FINE_LOCATION ] 和 [ COARES_LOCATION ]。 1、在Manifest.xml清单文件中添加对应的权限。 其中 An

    2024年02月15日
    浏览(35)
  • Android 全局监听软键盘弹起隐藏 动态修改布局并适配无限循环的问题

    要在 Android 应用中全局检测软键盘的弹起,您可以使用 ViewTreeObserver.OnGlobalLayoutListener 监听器来监听布局树的变化。当软键盘弹起或隐藏时,布局树会发生变化,因此您可以在监听器中捕获这些变化。 在上面的代码中, rootView 是您布局的根视图,您需要将其替换为您实际布局

    2024年02月11日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包