App启动页面优化

1、白屏问题

出现问题描述

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

为什么存在这个问题

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

2、解决白屏的办法

解决方案分析

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

第一种解决方案

  • 解决办法:给当前启动页添加一个有背景的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要求呢!

第二种解决方案

  • 禁止加载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 有这个短暂“假死”时间,建议使用第一种方法。

Application启动速度优化

提高app的启动速度,加快Application的执行时间也是一个很重要的方面,这里我暂时总结了几条原则:

  • 尽量不将一些业务逻辑放于Application中;
  • Application尽量不以静态变量的方式保存应用数据;
  • 若App的大小不是特别大无需使用dex分包方案;
  • 在Application中关于文件,数据库等耗时的操作尽量放到IntentService线程中处理
  • 不要做有关于循环的操作

启动页面屏蔽返回按键

一般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);
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 想喝鲫鱼汤,便去大张超市买条鲫鱼。 鲫鱼在鱼缸里游来游去,每条鲫鱼身上还带着一个小牌牌,挺有意思的。 随便捞了一条...
    边境baby阅读 514评论 0 4
  • 和男朋友说心里难过,然而他并不怎么安慰我,可能我想要一个电话,。明明难过的自己哭了好几回,和他说自己睡了,然后去发...
    小小番茄君阅读 229评论 0 0
  • 感恩昨晚浅浅的沉沉的睡眠 感恩酒店里的床褥 感恩酒店里的空调 感恩半夜你肚子疼,不知是吃了什么东西,我的身体一直是...
    合肥小海龟阅读 431评论 0 0
  • 良好的编程习惯从命名开始. 设置方法: 配置完成 ,试试 添加变量时候m,s 是不是自己就加上了!
    喜欢萌妹子的少年阅读 362评论 0 1
  • 只有从自己内心长出来的东西,才真正属于自己。 每个人都只相信自己。我们之所以相信另外一个人的话,那也是因为我们相信...
    究竟阅读 427评论 0 1