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时黑屏白屏的主要内容,如果未能解决你的问题,请参考以下文章