App启动优化,防止黑白屏

问题描述

app启动时,会出现一会儿的黑屏或者白屏才进入Activity的界面显示,但是有些app却不会,比如QQ,微信,微博等?

探究原因

当打开一个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属性,所以才会出现白屏或者黑屏的情况。

解决方案

通过上述的原因探究,我们一想“哎呀,尼玛的,原来解决方案不是TMD很简单嘛,就是给启动的activity添加一个指定的主题嘛!”,是的,我们的解决方案就是添加一个主题。

第一步 新建一个主题

在styles.xml文件中添加一个主题,我们就叫“SplashTheme”好吧

  <style name="SplashTheme" parent="AppTheme">
        <!-- 欢迎页背景引用刚才写好的 -->
        <item name="android:windowBackground">@drawable/splash_lancher</item>
        <item name="android:windowFullscreen">true</item>
        <!-- <item name="android:windowIsTranslucent">true</item> --> <!-- 透明背景不要了 -->
    </style>

第二步 添加一个layer-list

上述主题中我们发现android:windowBackground 似乎少了点什么,对嘛,我们少了个drawable,这个drawable我们可以直接用一个图片代替,如果你还要加点其他东东,我们当然推荐使用layer-list来创建一个drawable的文件了,示例如下:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- 设置整个屏幕背景为白色 -->
    <item >
        <color android:color="@color/white"/>
    </item>
 
    <!-- 中间logo -->
    <item >
        <bitmap
            android:gravity="center"
            android:src="@drawable/ic_launcher" />
    </item>
    <!-- 底部图表 -->
    <item android:bottom="10dp">
        <bitmap
            android:gravity="bottom|center_horizontal"
            android:src="@drawable/copyright" />
    </item>
 
</layer-list>

第三步 在AndroidManifest.xml中调用主题
在我们的启动activity中添加如下代码

        <activity
            android:name=".activity.SplashActivity"
            <--这里是我们添加的主题->
            android:theme="@style/SplashTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

然后就大功告成了

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容