App启动页面优化

目录介绍

  • 01.存在白屏问题
    • 1.1 问题描述
    • 1.2 问题分析
  • 02.解决白屏的办法
    • 2.1 解决方案分析
    • 2.2 第一种解决方案
    • 2.3 第二种解决方案
    • 2.4 注意要点
  • 03.Application启动速度优化
  • 04.启动页面屏蔽返回按键

好消息

  • 博客笔记大汇总【16年3月到至今】,包括Java基础及深刻知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,固然也在工做之余收集了大量的面试题,长期更新维护而且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计50篇[近30万字],转载请注明出处,谢谢!
  • 连接地址:github.com/yangchong21…
  • 若是以为好,能够star一下,谢谢!固然也欢迎提出建议,万事起于忽微,量变引发质变!
  • 轮播图封装库:github.com/yangchong21…
  • 轻量级版本更新弹窗:github.com/yangchong21…
  • 通知栏封装库:github.com/yangchong21…

01.存在白屏问题

1.1 问题描述

  • 出现问题描述
    • android app启动页面黑屏的问题,android开发app启动时若没有作特殊处理的话,会出现一瞬间的白屏现象。
    • 即便你启动页界面就加载一个布局,不作其余耗时处理,貌似也会出现一瞬间的白屏问题。注意,有些地方也称黑屏,主要是看你给app设置的style样式。
    • 当从桌面 Launcher 的小图标点击冷启动一个 App 的时候,程序须要进行一些基本的初始化操做,例如在Application 或者SplashActivity中作了不少耗时操做,例如初始化第三方SDK等,当手机性能很差,配置不高时,该现象尤为明显。

1.2 问题分析

  • 为何存在这个问题
    • 当系统启动一个APP时,zygote进程会首先建立一个新的进程去运行这个APP,可是进程的建立是须要时间的,在建立完成以前,界面是呈现假死状态,因而系统根据你的manifest文件设置的主题颜色的不一样来展现一个白屏或者黑屏。而这个黑(白)屏正式的称呼应该是Preview Window,即预览窗口。
    • 实际上就是是activity默认的主题中的android:windowBackground为白色或者黑色致使的。
    • 总结来讲启动顺序就是:app启动——Preview Window(也称为预览窗口)——启动页

02.解决白屏的办法

2.1 解决方案分析

  • Android在选择展现黑屏或者白屏的时候,是根据你设定的主题而不一样的,也就是说,虽然你的代码没有被执行,你的配置文件却被提早读取了,用来做为展现Preview Window界面的依据。因此,解决方案的切入口就是整个APP的manifest文件,更确切的说应该是主题配置文件。
  • 设置配置文件style样式中的windowBackground这个属性来显示一张背景图还有一个效果就是启动应用程序会感受很是快,并且与加载MainActivity的contentView是异步的。

2.2 第一种解决方案

  • 解决办法:给当前启动页添加一个有背景的style样式
    • 设置style样式以下
    <style name="SplashTheme" parent="AppTheme">
        <item name="android:windowBackground">@mipmap/splash</item>
        <item name="android:statusBarColor" tools:ignore="NewApi">@color/white</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>
    复制代码
    • 注意,在清单文件中
    <activity android:name=".SplashActivity"
        android:theme="@style/SplashTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
    
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    复制代码
  • 通过处理以后App启动时就不会出现一瞬间白屏的效果
    • 将主题设置到启动的Activity的主题中,windowBackground就是即将展现的preview window。其中splash能够是一整张图片,它也能够是一个能解析出图片资源的XML文件。
  • 该方案注意要点
    • 给Preview Window设置的背景图若是不作处理,图片就会一直存在于内存中,因此,当咱们进入到欢迎页的时候,不要忘了把背景图设置为空
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        //将window的背景图设置为空
        getWindow().setBackgroundDrawable(null);
        super.onCreate(savedInstanceState);
    }
    复制代码
  • 这样操做如何屏幕适配呢?
    • 这样经过样式style设置SplashActivity加载图,不能像imageView那样能够设置缩放功能,所以能够采用.9图片。
    • 之前有开发者采用个人这个建议,直接设置图,没有作适配,也无伤大雅,具体要看UI要求呢!

2.3 第二种解决方案

  • 禁止加载Preview Window,具体作法以下:
    <style name="SplashTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowDisablePreview">true</item>
    </style>
    复制代码
    • 设定为启动的Activity的主题,便可禁止Preview Window,固然,也有人经过把preview window设置为全透明,也达成了相似的效果。我的感受这种方法没有第一种好!
  • windowDisablePreview的做用
    • 经过设置android:windowDisablePreview属性,禁用窗口的预览动画,在SplashActivity显示以前,系统永远不会使用窗口的主题来显示它的预览,这也保证了不会出现白屏或者黑屏。可是,与设置android:windowIsTranslucent属性同样,若是在SplashActivity启动的时候,有过多复杂的操做,就会出如今手机中点击了应用程序的图标,但过n秒才会打开应用程序很差的卡顿体验效果。
  • 该方案是否有缺点?
    • 这种方法有个小缺点,就是点击后短暂的那几百毫秒没有反应,就好像“假死”了同样,过了一下子才跳出咱们应用程序的第一个Activity,若是你不想让你的 App 有这个短暂“假死”时间,建议使用第一种方法。

2.4 注意要点

  • 不论是那种方式,均可以解决问题。注意的是有些手机标题栏和状态栏也会影响这两图层的,形成抖动效果,为了不这种状况须要处理状态栏问题。这里能够直接引用我封装的状态栏库,有兴趣能够了解下,直接拿来用:github.com/yangchong21…

03.Application启动速度优化

  • 提升app的启动速度,加快Application的执行时间也是一个很重要的方面,这里我暂时总结了几条原则:
    • 尽可能不将一些业务逻辑放于Application中;
    • Application尽可能不以静态变量的方式保存应用数据;
    • 若App的大小不是特别大无需使用dex分包方案;
    • 在Application中关于文件,数据库等耗时的操做尽可能放到IntentService线程中处理
    • 不要作有关于循环的操做

04.启动页面屏蔽返回按键

  • 通常App中都会在启动页面执行一些初始化配置等,因此这时候启动页加载时不但愿用户经过按下返回按键退出App,于是能够在启动页中屏蔽返回按键,这里简单的介绍一下具体的实现:
    /**
     * Activity屏蔽物理返回按钮
     *
     * @param keyCode
     * @param event
     * @return
     */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
    复制代码

关于其余内容介绍

01.关于博客汇总连接

02.关于个人博客

相关文章
相关标签/搜索