解决白屏、黑屏问题,优化欢迎页显示

文章目录


前言

你的应用是否出现过,启动后白屏、黑屏、响应慢等问题?
想不想像微信、QQ那样秒启动?
想学吗?
我教你呀,哈哈哈哈哈


一、为什么会出现黑屏、白屏?

       这一切还得从android进程的起源说起:据说,在很久很久以前… …
       简单来说,在android系统中,有一个女娲级的进程叫zygote,它是Android系统上所有应用进程的父进程,所有应用运行的进程,都是由zygote一手创建起来的。
       但是,进程也不是一天建成的,那都是需要Time的!当用户马大爷点击了应用启动图标,zygote就会开始日夜赶工的创建进程,但是就是这么点间隙,如果android系统不给点什么反映,马大爷就会以为自己没点到,这会严重挫败马大爷的自信心呐,于是,android系统必须给个反映:

系统会根据你的manifest文件设置的主题颜色的不同来展示一个白屏或者黑屏。这个黑(白)屏的界面,就是PreviewWindow,即预览窗口。

二、怎么解决?

       既然女娲创建进程需要时间,系统也给女娲了时间,只不过,给的方式有点丑陋,那我们能不能美化下呢?也就是那个PreviewWindow的展示界面能不能好看些呢?或者说,能不能换成自定义的页面呢?
       上帝既然为你创造了双脚,你必定可以买到合适的鞋!
       直接在AndroidManifest.xml中的启动类添加Theme

    <style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowBackground">@drawable/splash</item>
        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
    </style>

1.图片变形怎么办?

2.出现留白怎么办?

3.跳转动画如何去掉?

哪儿那么多为什么,一次性解决所有问题:
很多博客说,使用.9啊。亲测,无效。(可能我测的姿势不对)

4.解决办法

使用layer-list,才是解决问题的关键。
比如下面这种情况的闪屏页面,使用layer-list是最优解:
android:windowBackground 设置时不使用原图,而是使用layer-list
同时,将闪屏页界面元素进行合理拆分,如下
theme:

    <style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowBackground">@drawable/layer_splash</item>
        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="android:windowAnimationStyle">@style/Animation_No</item> 
        <item name="android:windowFullscreen">true</item>
    </style>

layer_splash.xml: 顶部距离,底部距离自己把控

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:opacity="opaque"><!--android:opacity=”opaque” 属性,是为了防止在主题切换之间会闪现的黑屏。-->
    <item>
        <bitmap
            android:gravity="fill"
            android:src="@mipmap/splash_bg" />
    </item>
    <item android:top="80dp">
        <bitmap
            android:gravity="top|center_horizontal"
            android:src="@drawable/test_splash_title" />
    </item>
    <item android:top="170dp">
        <bitmap
            android:gravity="top|center_horizontal"
            android:src="@drawable/test_splash_center" />
    </item>
    <item android:bottom="50dp">
        <bitmap
            android:gravity="bottom|center_horizontal"
            android:src="@drawable/test_splash_logo" />
    </item>
</layer-list>

Animation_No:

    <style name="Animation_No">
        <item name="android:activityOpenEnterAnimation">@null</item>
        <item name="android:activityOpenExitAnimation">@null</item>
        <item name="android:activityCloseEnterAnimation">@null</item>
        <item name="android:activityCloseExitAnimation">@null</item>
        <item name="android:taskOpenEnterAnimation">@null</item>
        <item name="android:taskOpenExitAnimation">@null</item>
        <item name="android:taskCloseEnterAnimation">@null</item>
        <item name="android:taskCloseExitAnimation">@null</item>
        <item name="android:taskToFrontEnterAnimation">@null</item>
        <item name="android:taskToFrontExitAnimation">@null</item>
        <item name="android:taskToBackEnterAnimation">@null</item>
        <item name="android:taskToBackExitAnimation">@null</item>
    </style>

具体示例如下图:
splash_bg是渐变背景,由于UI设计了渐变色,只能也使用图片了(可以用.9)
test_splash_title是顶部的标题栏(应用名称,别惊讶,总有老板会把名字放这里的)
test_splash_center是中间的图片,注意,图片一定是不带背景颜色的,这样效果好。
test_splash_logo是底部的小太阳
解决白屏、黑屏问题,优化欢迎页显示

三、看看别人家的应用

1.Bilibli
B站的手机客户端,做的还是不错哒。
仔细看了下他家APP启动,猜测逻辑应该是这样,theme中的windowBackground应该是只设置了底部的logo,并使用了纯白背景,而后,启动页的真实activity的layout文件,应该是底部logo,中间添加了二次元图片。所以在启动哔哩哔哩时,会先显示底部logo纯白界面,后显示二次元+底部logo的界面。解决白屏、黑屏问题,优化欢迎页显示
但是 但是 但是,这种做的好了就是B站的那种效果,做的不好,就是下面这种效果了!!
解决白屏、黑屏问题,优化欢迎页显示
睁大眼看清楚,丁香妈妈那四个字,是不是有一个下移的效果。
这可不是开发专门做的特效,这应该是个bug,哈哈哈
而且,我发现滴滴,竟然也有这种问题!!!
这种明显的问题,测试肯定会问你的,能不能把这个特效去掉?!

当然可以的啦!
关键在于,theme中的layer-list的布局与启动页activity中的布局保持一致的同时,而且,要保证启动页也是全屏展示,即theme中也带有windowNoTitle和windowActionBar的属性

    <style name="FullScreen" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
    </style>

如果你没带这俩属性也显示正常,那么敲敲的告诉你,你把你的手机虚拟按键隐藏了你再看看试试!!!

总结

虽然说,解决了问题,但是说到底其实是个障眼法而已,三脚猫功夫。真正应该做的是优化启动逻辑,不能有了障眼法,就不去优化启动逻辑了。毕竟用户真正想要的是以最快的速度进到主应用、主界面,如果启动让用户等待太长时间,那这个应用估计很快就gg了。

自己铲平经理从远方喊话:
你看看人家支付宝,多大体量的APP,人家那启动时间,那基本上就来不及我反应,人家就打开了!再看看咱们自己的应用,搁这儿没睡醒呢还!!!!

不说了,不说了,赶紧跑路了。。。。。。

感谢:
Android 启动页的一些坑-多图杀猫
Android启动页黑屏及最优解决方案

上一篇:Android 代码混淆规则


下一篇:C# 做个Splash(启动屏幕)