Android应用启动白屏处理方案详解
作者:似曾相识2022 时间:2022-06-24 23:09:18
相信大家一定遇到过某些App在手机桌面打开时会出现短暂或者几秒钟的白屏情况吧,没错那是应用程序启动后系统默认的背景色,此时应用的第一个Activity还未被加载出来,所以不管怎么设置第一个Activity的背景色都毫无作用。但细心的朋友发现,有些App启动时白屏的时间又很短几乎可以忽略不计呢?今天就分享一篇关于App冷启动处理白屏时间过长的问题。
首先先聊一聊冷启动和热启动:
冷启动
杀掉App,此时的App进程不存在于后台,启动时从Logo页面开始。
热启动
App处于后台,进程未被杀死,重新进入前台时页面保持上一次页面,不会重新启动。
所以,我们此次所讲的属于冷启动过程,当应用程序代码量小、业务逻辑少、体积小时,App启动还是比较快,白屏时间可以忽略不计。一旦初始化工具过多,首页业务逻辑过多时启动速度会严重变慢,此时的白屏时间会越来越长,给人一种极差的体验。我们需要做的就是在白屏时间尽可能快速的展示Logo等图标,让它成为一个过渡,待应用程序准备好后跳转到相应页面以提高用户体验。
配置一个SplashActivity
首先,需要配置一个SplashActivity(应用展示的第一个Activity)的主题
<style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- 将splash图片设置在这,这样这张图片取代白屏 -->
<item name="android:windowBackground">@drawable/logo_drawable</item>
<item name="android:windowAnimationStyle">@style/notAnimation</item>
<!--将顶部状态栏设置为透明,并将界面内容布局上边界上提至状态栏顶部-->
<item name="android:windowTranslucentStatus">true</item>
<!--如果有底部虚拟导航栏,则将底部虚拟导航栏设置为透明,并将界面内容布局下边界下沉至虚拟导航栏底部-->
<item name="android:windowTranslucentNavigation">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowNoTitle">true</item>
<item name="windowActionBar">true</item>
</style>
其中windowBackground是我们本次重点配置,windowAnimationStyle是取消页面的一些动画效果,一般首页我们让它无动画,其他设置根据自己情况设置即可。
让我们来看看logo_drawable
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<color android:color="#ffffffff"/>
</item>
<item
android:top="208dp"
android:bottom="453dp">
<bitmap
android:gravity="center"
android:src="@mipmap/ic_logo" />
</item>
</layer-list>
白色背景上叠加一个bitmap,这里需要注意的是bitmap外层的item标签一定要根据设计稿配置好上下边距,否则运行App后的效果会被铺满屏幕。
然后我们将上面的主题配置到activity中,此时SplashActivity的布局文件中可以什么都不写,因为该主题就相当于背景,如果此处编写页面可能会和背景logo重合,仅需要编写一些逻辑和跳转处理。
<activity
android:name=".ui.splash.SplashActivity"
android:configChanges="orientation|screenSize"
android:exported="true"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
至此,再次运行打开App发现,几乎点开就是我们配置的logo,完美处理白屏问题。
注意:
如果项目使用了UI适配的三方库,例如androidAutoSize,一定记得根据文档处理放弃启动页适配,否则运行出来的效果也是不如意。
来源:https://juejin.cn/post/7203730887787053111
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Springboot如何操作redis数据
基于Spring-Security自定义登陆错误提示信息
![](https://img.aspxhome.com/file/2023/2/70352_0s.png)
Struts中使用validate()输入校验方法详解
![](https://img.aspxhome.com/file/2023/4/63744_0s.png)
Java程序员面试中的多线程问题总结
详解Android中Runtime解决屏幕旋转问题(推荐)
详解Java设计模式编程中的中介者模式
![](https://img.aspxhome.com/file/2023/9/78959_0s.jpg)
Spring Cloud 网关服务 zuul 动态路由的实现方法
![](https://img.aspxhome.com/file/2023/8/86868_0s.png)
为什么wait和notify必须放在synchronized中使用
![](https://img.aspxhome.com/file/2023/7/71187_0s.webp)
Java命令设计模式优雅解耦命令和执行提高代码可维护性
![](https://img.aspxhome.com/file/2023/1/59861_0s.png)
Android自定义dialog简单实现方法
浅谈Java多进程程序的运行模式
springboot2.0使用Hikari连接池的方法(替换druid)
![](https://img.aspxhome.com/file/2023/1/70531_0s.png)
springboot 自定义启动器的实现
![](https://img.aspxhome.com/file/2023/7/72567_0s.png)
C#实现批量Word转换Html的示例代码
![](https://img.aspxhome.com/file/2023/5/76405_0s.png)
Java之如何关闭流
java字符串遍历的几种常用方法总结
springMVC自定义注解,用AOP来实现日志记录的方法
Java List分页功能实现代码实例
C#实现读写ini文件类实例
Struts2拦截器 关于解决登录的问题
![](https://img.aspxhome.com/file/2023/1/78241_0s.png)