Android启动APP时黑屏白屏

Posted 威威dett

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android启动APP时黑屏白屏相关的知识,希望对你有一定的参考价值。

介绍黑白屏前先介绍2个概念

冷启动:指 app 第一次启动或者启动被后台杀死后在这个状态打开 app,这种启动方式叫做冷启动。

热启动:指 app 没有被后台杀死,按home仍然在后台运行,通常我们再次去打开这个 app,这种启动方式叫热启动。

每当我们冷启动打开app的时候,会出现一会儿的黑屏或者白屏才进入Activity的界面显示,但是有些app却不会如手机QQ,微信。
为什么会出现这样的现象呢?:主要是由于在应用启动的时候需要加载相关资源,在还没有执行到setContentView之前,界面显示的黑屏白屏就是window窗口背景

下面介绍2中解决方法:

1.直接给启动页加载布局之前的window背景设置成透明色。这样用户点击的时候就看不到黑色或者白色的现象,具体写法参看下面的代码:

style.xml中定义如下样式

<style name="flash_window" parent="Theme.AppCompat.Light.NoActionBar">
        <!--   透明     -->
        <item name="android:windowIsTranslucent">true</item>
        <!--   不显示title     -->
        <item name="android:windowNoTitle">true</item>
        <!--   全屏     -->
        <item name="android:windowFullscreen">true</item>
</style>

引用上面的样式

 <activity
            android:name=".ui.SplashActivity"
            android:configChanges="orientation|keyboard"
            android:theme="@style/flash_window"
            android:screenOrientation="portrait">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>

这样就去掉了黑白屏的现象了,但是没有黑白屏感觉点击了桌面图标有点不是特别顺滑,有没有更好的方法了呢?下面介绍第二种方法

2.在第一种方法的基础上做了点优化,这次不是直接给window的背景设置成透明色,而是使用一个我们自定义的图片来代替,具体写法参看下面的代码

styles.xml中定义如下样式

 <style name="flash_window" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- <item name="android:windowIsTranslucent">true</item> -->
        <!-- 用背景图片代替透明色,为了防止图片拉伸,这里使用layer-list来处理图片显示 -->
        <item name="android:windowBackground">@drawable/splash_layer</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowFullscreen">true</item>
        <!-- 防止手机虚拟按键挡住界面,api>21才有这个属性,需要在values-21中的styles.xm文件中l定义-->
        <item name="android:windowDrawsSystemBarBackgrounds" tools:targetApi="21">false</item>
 </style> 

drawable文件夹中创建splash_layer.xml文件,写入如下内容

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
	    <item android:drawable="@android:color/white" />
	
	    <!-- 可能图片距离底部太近,可适当调整 -->
	    <item android:bottom="20dp">
	        <bitmap
	            android:gravity="center"
	            android:src="@mipmap/ic_launcher" /> <!--需要使用的图片 -->
	    </item>
</layer-list>

引用上面的样式

<activity
            android:name=".ui.SplashActivity"
            android:configChanges="orientation|keyboard"
            android:theme="@style/flash_window"
            android:screenOrientation="portrait">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>

这样就可以非常顺滑的启动我们的app了,且不会出现白屏或者黑屏的现象

但是,如果在高分辨率下layer-list设置的一个图片无法铺满整个屏幕可以设置android:gravity="fill"如下

<bitmap
            android:gravity="fill"
            android:src="@mipmap/ic_gui" />

同样这种方法还是有个缺点,就是我们要在需要适配的屏幕分辨率下做相应的图片,防止图片显示变形。有没有什么好方法解决这个问题呢?下面给介绍一个方法供参考

使用layer-list来组合图片,将我们要显示的图片分割成多个模块,当然不一定适用所有的场景(如:需要显示的图片比较复杂,不适合分割)

由于layer-list中的图片下面的会覆盖上面添加的图片,因此我们可以设置top,bottom,left,right来定位各个图片,就类似于FrameLayout叠放View的效果,下面给一个参考例子:

drawable文件夹中创建splash_layer.xml文件,之后就可以当做一个splash背景图来引用了。
更多关于layer-list的使用方法可自行百度

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- 背景颜色   -->
    <item android:drawable="@android:color/white" />

    <!--  最上面的图片  -->
    <item>
        <bitmap
            android:gravity="top|center_horizontal"
            android:src="@mipmap/icon_wx" /><!--需要使用的图片 -->
    </item>

    <!--  中间的图片  -->
    <item>
        <bitmap
            android:gravity="center|center_horizontal"
            android:src="@mipmap/icon_wx" /><!--需要使用的图片 -->
    </item>

    <!-- 最下面的图片   -->
    <item
        android:top="100dp">
        <bitmap
            android:gravity="bottom|center_horizontal"
            android:src="@mipmap/icon_wx" /><!--需要使用的图片 -->
    </item>
</layer-list>

效果图如下:

以上是关于Android启动APP时黑屏白屏的主要内容,如果未能解决你的问题,请参考以下文章

Android启动黑屏白屏解决方案

Android开发中页面启动时黑屏或者白屏的原因及解决办法

解决android 启动白屏问题

Android项目启动时短暂的黑屏白屏处理

Android 启动页白屏与黑屏

Android 启动页白屏与黑屏