适配splashscreen步骤以及遇到的坑

news2024/9/21 12:40:39

Android 12 启动画面

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

也就是说,只要你的应用运行在Android 12的系统上,都会受到影响,以支付宝为例,截止到2023-01-24日,在Android 13的系统上冷启动时,可以很明显的看到会出现一个闪屏页,页面中间会显示一个启动图标。这个就是受到了系统影响,没有做适配。

请添加图片描述

Google应该是想让Android有一个统一的启动风格,但是讲道理推出的有点太晚了,国内的App启动页不仅仅是个简单的展示,有的还要显示广告,且风格也各不相同,都有自己的一套启动ui,所以,推出这个splashscreen对国内的app完全是个负担。
但是不适配的话启动的时候看起来有很怪,会出现两个闪屏页,所以,还是要硬着头皮适配一下。

SplashScreen适配

适配方法也很简单,按照官方文档的步骤来即可。
官方建议我们使用AndroidX中的SplashScreen库,该库使用 SplashScreen API,能够向后兼容,官方宣称可在所有 Android 版本上显示外观和风格一致的启动画面。

但是实际使用并非如此,例如动画在Android 12 以下的系统上不生效,如果需要动画,可自己使用其他方式实现,如果只是显示一个图片,那么就不受影响。

以下是适配步骤

将compileSdkVersion更改为31或以上

compileSdkVersion 31

添加依赖

implementation 'androidx.core:core-splashscreen:1.0.0'

准备启动页面要显示的图片或者动画

在这里插入图片描述

新增主题

    <style name="Theme.App.SplashScreen" parent="Theme.SplashScreen">
        <!--背景颜色-->
        <item name="windowSplashScreenBackground">@color/white</item>
        <!--设置动画或图片,注意动画在Android12 以下不生效 很难受...-->
        <item name="windowSplashScreenAnimatedIcon">
            @drawable/ic_splash
        </item>
        <!--动画执行时间-->
        <!--        <item name="windowSplashScreenAnimationDuration">1000</item>-->
        
        <!--设置闪屏也后启动页面的主题 说白了 就是app本来的主题-->
        <item name="postSplashScreenTheme">@style/Theme.XeonYuTheme</item>

    </style>

创建启屏页面 SplashActivity
先指定页面的主题
在这里插入图片描述

然后就是代码了,代码非常简单,如果你没有其他需求,直接在oncCreate中调用 installSplashScreen() ,然后正常跳转页面即可.

class SplashActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        /*setContentView 可不写*/
//        setContentView(R.layout.activity_splash)
        /*创建与页面关联的SplashScreen实例*/
        installSplashScreen()
        /*跳转页面*/
        val intent = Intent(this, MainActivity::class.java)
        startActivity(intent)
    }
}

然后运行看看
请添加图片描述
可以看到,启屏页就ok了,非常简单。

在启动屏幕页面显示弹窗

一般情况下,我们需要在用户首次打开app时弹窗让用户同意隐私协议,以及做一些初始化操作之类的。那这种情况下,如要用户点击同意后再进行跳转。

此时,我们可以使用setKeepOnScreenCondition 配合 setOnExitAnimationListener,示例代码如下


class SplashActivity : AppCompatActivity() {

    /**
     * 控制是否保持启动页面的变量,值为false时继续往下走
     */
    private val keepOnScreenCondition = AtomicBoolean(true)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        /*setContentView 可不写*/
//        setContentView(R.layout.activity_splash)
        /*创建与页面关联的SplashScreen实例*/
        installSplashScreen().apply {
            /*保持住启动页面的显示*/
            setKeepOnScreenCondition {
                keepOnScreenCondition.get()
            }
            /*指定是否Activity要自己处理启动画面动画 实际上就是keepOnScreenCondition的值为false时这个就会回调*/
            setOnExitAnimationListener {
                /*在这里我们可以弹窗让用户同意隐私政策*/
                val alertDialog = AlertDialog.Builder(this@SplashActivity)
                    .setTitle("隐私协议")
                    .setMessage("隐私协议内容")
                    .setPositiveButton(
                        "同意"
                    ) { dialog, which ->

                        /*跳转页面*/
                        val intent = Intent(this@SplashActivity, MainActivity::class.java)
                        startActivity(intent)
                    }
                    .setNegativeButton("拒绝") { dialog, which ->
                        this@SplashActivity.finish()
                    }.create();
                alertDialog.show();
            }

        }


        MainScope().launch {
            Log.i("SplashActivity", "可以做一些初始化逻辑")
            delay(500)
            keepOnScreenCondition.compareAndSet(true, false)
        }

    }
}

再来运行看看:
请添加图片描述

部分设备debug模式下setOnExitAnimationListener不回调的问题

美滋滋的写完代码后,以为没啥问题了,结果换了个Android12的真机运行后发现一直卡在启动页,并没有弹窗或者跳转页面,试了好多次依旧如此。
加了log发现setOnExitAnimationListener中的回调没有执行。明明是按照官方文档写的,怎么会有问题呢?
仔细看了下文档说是要保证在splashscreen退出前setOnExitAnimationListener,这个我代码是肯定没问题的。

后来手动把app杀死,然后点击图标手动启动时又是正常的,给我整懵了,于是查了下资料发现其他人也遇到了这种问题。

https://issuetracker.google.com/issues/197906327

这个问题被google官方人标记为是预期的,不会解决,解释如下:
在这里插入图片描述

意思就是:
这个是有意这样的,因为IDE实际上使用Instrumentation来打开应用程序,所以系统将其解释为一个应用程序打开另一个应用程序,而不是用户单击启动器图标。
所以会出现setOnExitAnimationListener不执行的情况,遇到这种情况手动启动就行了,不用太过在意。


如果你觉得本文对你有帮助,麻烦动动手指顶一下,可以帮助到更多的开发者,如果文中有什么错误的地方,还望指正,转载请注明转自喻志强的博客 ,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/177563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚函数的静态解析

目录 一.基类的constructor和destructor内 二.使用的是基类的对象而不是基类对象的pointer或reference 存在两种情况&#xff0c;虚函数机制不会出现预期行为&#xff1a; 即不根据虚函数的机制来调用类中对应的虚函数 示例中使用的基类和派生类&#xff1a; class base_cl…

vue事件车的原理与标准写法实现兄弟组件的传值

目录前言一&#xff0c;全局事件总线介绍1.1 原理介绍1.2 x需要满足的条件二&#xff0c;知识点的复习2.1 vc是什么2.2 vm管理vc如何体现2.3 原型2.4 上述知识的串联三&#xff0c;实现需求3.1 x的编写及讲解3.2 使用x四&#xff0c;标准写法4.1 写法改动4.2 销毁五 关键代码后…

有关BMP位图的分析

1、BMP是什么&#xff1f; BMP是 Bitmap&#xff08;位图&#xff09;的简称&#xff0c;是windows显示图片的基本格式。 在windows下&#xff0c;任何格式的图片文件&#xff08;包括视频播放&#xff09;都要转化为位图才能显示出来&#xff0c;各种各样格式的图片文件也都…

9.Java数组知识大全

文章目录前言一、数组介绍二、数组的定义域静态初始化三、数组元素访问数组地址中的小拓展:四、数组遍历1.获取数组里面的元素2.把数据存储到数组中3.遍历数组的最快方式4.遍历数组并求和5.统计个数6.变化数据五、数组动态初始化1.数组默认初始化值的规律2.数组动态初始化和静态…

单绞机控制算法模型(Simulink仿真)

线缆行业单绞机PLC控制算法详细解读可以参看下面的文章链接: 线缆行业单绞机控制算法(详细图解+代码)_RXXW_Dor的博客-CSDN博客在了解单绞机之前需要大家对收放卷以及排线控制有一定的了解,不清楚的可以参看下面几篇博客,这里不再赘述,受水平和能力所限,文中难免出现错…

【JavaEE】认识线程Thread类及常用方法线程状态

目录 一&#xff1a;认识线程&#xff1a; 二、线程的优点&#xff1a; 三、进程和线程的区别&#xff08;面试题&#xff09;&#xff1a; 四、第一个多线程程序&#xff1a; 五、创建线程的方式&#xff1a; 六、Thread类及常用方法 Thread类常见构造方法&#xff1…

整理介绍字符函数和字符串函数+内存函数

本篇重点介绍处理字符和字符串的库函数的使用和注意事项 本篇重点本篇重点介绍处理字符和字符串的库函数的使用和注意事项前言&#xff1a;求字符串长度strlen拷贝字符串函数strcpy&#xff08;追加&#xff09;连接字符串函数strcat比较两个字符串函数strcmp对上面改进字符串函…

Mac应用程序无法打开或文件损坏的处理方法

很多用户在安装 盗版 Mac软件的时候&#xff0c;经常会遇到提示“xxx.app已损坏&#xff0c;打不开。您应该将它移到废纸篓“或”打不开的xxx.app&#xff0c;因为它来自身份不明的开发者”&#xff0c;等多种打不开盗版软件的各种提示&#xff0c;正版软件则不会出现。 错误截…

17种编程语言实现排序算法-基数排序

开源地址 https://gitee.com/lblbc/simple-works/tree/master/sort/ 覆盖语言&#xff1a;C、C、C#、Java、Kotlin、Dart、Go、JavaScript(JS)、TypeScript(TS)、ArkTS、swift、PHP。 覆盖平台&#xff1a;安卓(Java、Kotlin)、iOS(SwiftUI)、Flutter(Dart)、Window桌面(C#)、…

事件冒泡和时间捕获

事件冒泡和事件捕获 最近&#xff0c;在复习Vue的时候&#xff0c;发现自己对于事件冒泡和事件捕获的理解存在一定的错误。于是想写一份笔记来总结一下事件冒泡和事件捕获。✌✌✌ 一、事件 1、事件的三个阶段&#xff1a;事件捕获->事件目标->事件冒泡 捕获阶段&am…

MySQL 性能优化浅析及线上案例

作者&#xff1a;京东健康 孟飞 1、 数据库性能优化的意义 业务发展初期&#xff0c;数据库中量一般都不高&#xff0c;也不太容易出一些性能问题或者出的问题也不大&#xff0c;但是当数据库的量级达到一定规模之后&#xff0c;如果缺失有效的预警、监控、处理等手段则会对用户…

设计模式学习(十二):Decorator装饰器模式

一、什么是Decorator模式假如现在有一块蛋糕&#xff0c;如果只涂上奶油&#xff0c;其他什么都不加&#xff0c;就是奶油蛋糕。如果加上草莓&#xff0c;就是草莓奶油蛋糕。如果再加上一块黑色巧克力板&#xff0c;上面用白色巧克力写上姓名&#xff0c;然后插上代表年龄的蜡烛…

JavaEE5-Spring更简单的读取和存储对象

目录 1.存储Bean对象 1.1.前置工作&#xff1a;在配置文件中设置bean扫描的根路径&#xff08;重要&#xff09; 1.2.添加注解存储Bean对象到Spring中 1.2.1.类注解(添加到某个类上&#xff0c;将当前的类存储到Spring中)&#xff1a;Controller&#xff0c;Service&#x…

树,堆,二叉树的认识

1.树概念及结构 1.1树的概念 注意&#xff1a;树形结构中&#xff0c;子树之间不能有交集&#xff0c;否则就不是树形结构 1.2 树的相关概念 1.3 树的表示 树结构相对线性表就比较复杂了&#xff0c;要存储表示起来就比较麻烦了&#xff0c;既然保存值域&#xff0c;也要保存…

Gateway服务网关

Gateway服务网关一、网关介绍二、gateway快速入门1.创建gateway服务&#xff0c;引入依赖2.编写启动类3.编写基础配置和路由规则4.重启测试5.网关路由的流程图三、断言工厂四、过滤器工厂1.路由过滤器的种类2.请求头过滤器3.默认过滤器4.总结五、全局过滤器1.全局过滤器作用2.自…

fpga实操训练(系统开发和硬件接口)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 相信很多学习fpga的同学都会有这样的一个感受,一开始fpga学习还比较简单,但是一旦涉及到呼吸灯、uart、spi、iic、ddr2后面就会越来越难。遇到这样的困难之后,学习的激情一下子少…

从零搭建一个组件库(一)项目环境搭建

文章目录前言monorepo架构1.monorepo架构的优势2.使用pnpm搭建monorepo架构&#xff08;1&#xff09;全局安装pnpm&#xff08;2&#xff09;初始化项目&#xff08;3&#xff09;新建workspace.yaml文件4.不同包之间的相互引用TypeScript支持1.安装TypeScript2.初始化TypeScr…

http三次握手四次挥手详解

1、 TCP的三次握手和四次挥手实质就是TCP通信的连接和断开。 三次握手&#xff1a;为了对每次发送的数据量进行跟踪与协商&#xff0c;确保数据段的发送和接收同步&#xff0c;根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系&#xff0c;并建立虚连接。 四次挥…

C++6:STL-模拟实现string

string时STL中的模板库之一&#xff0c;类似于专门处理字符串的数据结构&#xff0c;在模拟实现并探讨其中构造的巧妙之处之前&#xff0c;我们短浅的认识一下STL是什么 目录 什么是STL STL的诞生 关于string string的模拟实现 构造函数和析构函数 实现简单的string打印 …

【蓝桥杯】简单数论2——快速幂矩阵快速幂

1、快速幂 1.1运算模 定义&#xff1a;模运算为a除以m的余数&#xff0c;记为a mod m&#xff0c;有a mod m a % m。 模运算是大数运算中的常用操作&#xff1a;如果一个数太大&#xff0c;无法直接输出&#xff0c;或者不需要直接输出&#xff0c;可以把它取模后&#xff0…