Android APP启动时黑屏或者白屏的问题很常见,解决起来也不复杂。下面总结一下出现的原因,以及常见的解决此问题的两种方案。
其实,APP启动时出现黑屏或者白屏并不是不正常,只是还没有加载到APP首个启动的Activity(以下以SplashActivity为例)的布局文件,就显示了window窗口的背景,黑色或者白色就是window窗口的背景颜色。
如果想要看一下黑屏或者白屏的效果,可以在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);
}
至于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窗口默认的黑色或者白色,就要从这个属性下手了。常见的解决方案有以下两种:
1、为window窗口提供背景图
这种解决方案简单粗暴,一张图片搞定整个页面的显示,对于比较复杂的启动页,这种方式倒还不错。如果启动页并不是很复杂,还是推荐采用第二种方案,毕竟,图片比较占内存嘛。至于常用的图片有.png和.9.png两种,关于.9.png相对于.png的优势,就不再赘述了。
2、使用Layout-list制作背景图
先上Layout-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>
Layou-list的调用方式是在Theme中设置为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中,而不是放在已有的AppTheme中,是想要仅仅改变SplashActivity的窗口背景,同时保持其他Activity的窗口背景不变。StartAppTheme的调用是在Manifest.xml中,示例如下:
<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>
……
至此,所有工作完成。上一张效果图吧: