Android Splash界面白屏、黑屏问题的解决方法
作者:zinss26914 时间:2022-03-24 07:14:44
前言
我相信很多Android开发同学都遇到过这样的需求:
1.实现一个Splash界面,界面上有应用相关的背景图片和一个开始按钮.
2.点击按钮之后进入主页,以后用户再打开应用就不显示这个Splash界面了.
也相信很多同学都遇到了这样的困惑:
•第二次进入应用,尽管你在Splash界面已经直接跳转到首页了,但是还是有个白屏或者黑屏或者带ActionBar的白屏闪现一下.
如果你也遇到这个问题,那就继续阅读这篇文章,我带大家去分析和解决这个问题.
解决方案
这里我们先给出解决方案,然后再具体分析产生原因哈.避免分析的大段文字阻碍了同学学习的热情.
解决方案非常简单,一句话概括是:给Splash Activity设置一个主题,主题内容是:全屏+透明.
style.xml增加SplashTheme主题:
<style name="SplashTheme" parent="AppTheme">
<item name="android:windowFullscreen">true</item>
<item name="android:windowIsTranslucent">true</item>
</style>
AndroidManifest.xml中为SplashActivity配置主题:
<activity android:name=".activity.SplashActivity"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
经过如上配置,困扰你的白屏、黑屏、ActionBar屏应该都已经烟消云散了.为了知其然,并知其所以然,希望同学能继续跟我一起分析一下这些白屏产生的原因.
Activity组件的窗口启动过程
首先声明,本段内容大量参考了罗升阳老师的博客。为了方便理解,对其内容进行了压缩。如果侵权,我立刻删掉这段分析哈。
想要了解白屏产生的根源,就不得不去跟踪Activity组件的窗口启动过程。Activity组件在启动的过程中,会调用ActivityStack类的成语函数startActivityLocked方法。注意,在调用ActivityStack类的成语函数startActivityLocked方法的时候,Activity组件还处于启动过程中,即它的窗口尚未显示出来,不过这时候ActivityManagerService服务会检查是否需要为正在启动的Activity组件显示一个启动窗口。如果需要的话,那么ActivityManagerService服务就会请求WindowManagerService服务为正在启动的Activity组件设置一个启动窗口(ps:而这个启动窗口就是白屏的由来)。
1. ActivityStack.startActivityLocked
public class ActivityStack {
// set to false to disable the preview that is shown while a new activity
// is being started.
static final boolean SHOW_APP_STARTING_PREVIEW = true;
private final void startActivityLocked(ActivityRecord r, boolean newTask, boolean doResume) {
final int NH = mHistory.size();
int addPos = -1;
// Place to new activity at top of stack, so it is next to interact
// with the user.
if (addPos < 0) {
addPos = NH;
}
// Slot the activity into the history stack and proceed
mHistory.add(addPos, r);
if (NH > 0) {
// We want to show the starting preview window if we are
// switching to a new task, or the next activity's process is
// not currently running.
boolean showStartingIcon = newTasks;
ProcessRecord proc = r.app;
if (proc == null) {
proc = mService.mProcessNames.get(r.processName, r.info.applicationInfo.uid);
}
if (proc == null || proc.thread == null) {
showStartingIcon = true;
}
}
}
}
未完待续…希望大家继续关注。
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
详解Kotlin:forEach也能break和continue
UnityUI中绘制线状统计图
![](https://img.aspxhome.com/file/2023/6/82146_0s.jpg)
Spring Boot接口幂等插件用法示例解析
![](https://img.aspxhome.com/file/2023/0/78890_0s.png)
java8 集合 多字段 分组 统计个数代码
![](https://img.aspxhome.com/file/2023/5/72325_0s.jpg)
redis统计APP在线人数的实例
C# 数独求解算法的实现
![](https://img.aspxhome.com/file/2023/2/68102_0s.png)
C# WinForm-Timer控件的使用
![](https://img.aspxhome.com/file/2023/7/92837_0s.png)
Java内部类及其特点的讲解
![](https://img.aspxhome.com/file/2023/7/61657_0s.png)
Bootstrap 下拉菜单.dropdown的具体使用方法
详解Swagger接口文档和常用注解的使用
![](https://img.aspxhome.com/file/2023/7/59847_0s.png)
C++右值引用与move和forward函数的使用详解
Java中通过jsch来连接远程服务器执行linux命令
Windows下RabbitMQ安装及配置详解
![](https://img.aspxhome.com/file/2023/1/62411_0s.png)
Spring @Bean注解的使用场景与案例实现
Protostuff序列化和反序列化的使用说明
springboot快速集成mybatis-plus的详细教程
![](https://img.aspxhome.com/file/2023/4/73014_0s.png)
Unity3D使用Shader实现腐蚀消失
![](https://img.aspxhome.com/file/2023/1/89751_0s.gif)
java分布式面试CAP分别代表含义分析
![](https://img.aspxhome.com/file/2023/7/90027_0s.jpg)
Java解析json报文实例解析
IDEA远程管理docker镜像及容器服务的实现
![](https://img.aspxhome.com/file/2023/9/63439_0s.png)