Android App桌面启动时,会出现黑/白闪屏问题的解决

先看两幅动图:斗鱼&B站

这里写图片描述这里写图片描述

有的App,每次启动的时候,是直接进入这个启动页面。如图1;有的App会先白屏停顿一下后再进入启动页面(Splash),如图2;

很多时候,我们启动APP时会有短暂的白屏或者黑屏,大概1~2秒后,才会显示主界面或者显示启动页,这是为什么呢?本篇文章来介绍一下,并给出APP启动秒开的解决办法。

一、原因分析

当打开一个Activity时,如果这个Activity所属的应用还没有在运行,系统会为这个Activity所属的应用创建一个进程,但进程的创建与初始化都需要时间,在这个动作完成之前系统要做什么呢?如果没有任何反应的话,如果程序初始化的时间很长,用户可能还以为没有点到相应的位置。但此时所启动的程序还没初始化完,既无法显示程序,又不能停在原处不做任何动作,怎么办?这就有了Starting Window的概念,也可以称之为Preview Window。

Starting Window就是一个用于在应用程序进程创建并初始化成功前显示的临时窗口,拥有的Window Type是TYPE_APPLICATION_STARTING。在程序初始化完成前显示这个窗口,以告知用户系统已经知道了他要打开这个应用并做出了响应,当程序初始化完成后显示用户UI并移除这个窗口。

显示白屏或者黑屏,是由你的启动Activity或者Application来决定的。如果你使用的是Light主题,那么就可能出现白屏;如果你使用的是Black主题,那么就可能出现黑屏。当你设置Light或者Black主题时,Starting Window显示的就是你启动Activity的android:windowBackground属性,所以才会出现白屏或者黑屏的情况。

二、解决办法

1、定义纯颜色背景或者图片

a、纯颜色,直接设置android:windowBackground属性为颜色代码:

<item name="android:windowBackground">@color/colorAccent</item>
b、图片, 需要在Drawable中定义一个splash.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- 背景颜色 --> 
    <item android:drawable="@color/green" /> <item> 
    <!-- 图片 --> 
    <bitmap android:gravity="center" android:src="@drawable/icon_welcome" /> </item>
</layer-list>

2、设置style.xml

a、设置背景图Theme

<style name="Theme.AppStartLoad" parent="android:Theme">  
  <item name="android:windowBackground">@drawable/ipod_bg</item>  
  <item name="android:windowNoTitle">true</item>  
</style>
b、 设置透明Theme
<style name="Theme.AppStartLoadTranslucent" parent="android:Theme">  
  <item name="android:windowIsTranslucent">true</item> 
  <item name="android:windowNoTitle">true</item>  
</style>

上面我定义了两种Theme,第一种Theme就是设置一张背景图。当程序启动时,首先显示这张背景图,避免出现黑屏。第二种Theme是把样式设置为透明,程序启动后不会黑屏而是整个透明了,等到界面初始化完才一次性显示出来。

3、修改AndroidManifest.xml

为了使上面Theme生效,我们需要设置一些Activity的Theme
<application
  android:allowBackup="true"
  android:icon="@drawable/ipod_icon"
  android:label="@string/app_name"
  android:launchMode="singleTask">

<!-- iPod主界面 -->
<activity
  android:name="com.apical.apicalipod.IPodMainActivity"
 <!-- 使用上面定义的样式-->
  android:theme="@style/Theme.AppStartLoad"
  android:label="@string/app_name" >
  <intent-filter>
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>

//......

</application>
完!!!



猜你喜欢

转载自blog.csdn.net/xialong_927/article/details/80059499