Android APP启动时黑屏或者白屏的问题很常见,解决起来也不复杂。下面总结一下出现的原因,以及常见的解决此问题的两种方案。
问题出现
先看一下黑屏或者白屏的情形吧,在SplashActivity加载布局文件之前设置主线程睡眠几秒钟,使黑/白屏必然出现
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置主线程睡眠3秒钟
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 加载布局文件
setContentView(R.layout.activity_splash);
}
问题成因
其实,应用程序启动时出现黑屏或者白屏并不算异常,只是还没有加载到应用首个启动的Activity的布局文件,这时候显示的是Window窗口的背景,黑色或者白色就是window窗口的背景颜色。
Window窗口的背景颜色的设置,可以通过资源文件style.xml中AppTheme的android:windowBackground属性:
<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@color/white</item>
</style>
所以,想要解决黑/白屏的问题,自然要从Window窗口的背景下手。
解决问题
方案一:为Window窗口提供背景图
这种解决方案简单粗暴,一张图片搞定整个页面的显示,对于比较复杂的启动页,这种方式倒还不错。如果启动页并不是很复杂,还是推荐采用第二种方案,毕竟,图片比较占内存嘛。至于图片,推荐的就是.png和.9.png两种了。
方案二:使用Layout-list制作背景图
第一步,构建layer-list。如下layout-list-start-pic.xml:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 设置整个屏幕的大背景 -->
<item>
<bitmap android:src="@mipmap/login_bg_black" />
</item>
<!-- 中间logo -->
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/start_img_logo" />
</item>
</layer-list>
第二步,在Theme中将layer-list文件设置为window窗口的背景图:
<style name="StartAppTheme" parent="AppBaseTheme">
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowBackground">@drawable/layout_list_start_pic</item>
</style>
第三步,将StartAppTheme设置为应用程序首个启动的Activity的theme:
<application
android:name=".base.BaseApplication"
android:allowBackup="true"
android:icon="@mipmap/logo"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".login.SplashActivity"
android:launchMode="singleTop"
android:theme="@style/StartAppTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
至于为什么新创建了一个StartAppTheme,而不是对AppTheme直接修改,是因为我们想要的仅仅是改变SplashActivity的窗口的背景,同时还是要保证其他Activity的窗口风格不变的。
至此,黑/白屏的问题就解决了,上一张效果图吧: