用以提高 App 启动速度的提升

案例

新建一个项目, Run 之后 App 启动或者用户从 Launcher 点击图标启动 App 的过程就可以感受到启动速度之慢,当首次打开的界面有一定的复杂渲染也跟着费时起来,所以我们经常会在启动显示的第一个页面只显示一张图,这样的话就会减轻渲染的压力,从而进一步的提升启动速度。

But

这还是会有一定的渲染时间,在启动的过程中,系统会需要给 App 创建一个进程,进程的创建和初始化都是耗时的,大家都知道 Activity 的绘制也是需要时间的,所以 系统框架设计了一个 StartWindow 的窗口,在 Activity 的 Window 绘制完成之前显示的就是这个 StartWindow, 所以从 Click Lanucher 图标到绘制等一系列准备过程完成之前显示的就是这个 StartWindow,也就是大家看到的黑屏或者别的什么,默认颜色是随着指定的 Theme 展示的,然而 StartWindow 是可以定制的,说到这里大家应该已经想到解决方案了,没错,我第一个解决方案就是把它设为透明的,效果就是 Click Lanucher 图标后,看到的还是桌面,待等待准备工作完成才进入到界面,第一版就准备这样上线了。

当初没记错的话是 15 年还使用了 Ijiami 进行项目代码加密,上线第二天就收到反馈软件打不开,特么的吓得我赶紧看了 线上 Bug list,ANR!! 没错就是 ANR,当然不排除是用户猴急等了很长时间没反应于是狂滑别的地方,But 自己试了也是会 ANR,版本普遍基本是 5.0,之后试过 Qihu、Tencent、Bangcle 等加密方案均有此问题,问过相关技术人员,基本敷衍盖过,以至于之后就没用过加密,期间有表示已修复 5.0 的问题,试了还是有毛病。

回到正题

已知设为透明是存在一定的问题的,于是改进,把 StartWindow BackGround 设为和启动页一个颜色,或者直接给启动页截图(UI 妹妹给和启动页一模一样的图,不要截图,不同分辨率的手机可能存在锯齿等问题)

StartWindow Color BackGround

设置为颜色背景前提是在启动页有纯色的背景,给用户一种障眼法,虽然看到了颜色但是其实系统还处于给 App 分配进程等一系列操作中,这种方式为最优。

StartWindow Image BackGround

设置为图片背景,有毛病但是体验最佳,毛病在哪呢,魅族等手机屏幕尺寸很恶心,不走寻常路的,是会使图片变形的,当然也有解决方案,但是没试过,不过基本原理上来讲是行得通的可用的方法就是不同屏幕放不同图片,可能会有用吧。

CODE

1
2
3
4
5
<style name="name" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">填写颜色或者图片做背景</item>
<item name="windowActionBar">false</item> // 不显示 ActionBar
<item name="windowNoTitle">true</item> // 不显示 title
</style>

附加项

level 19
1
<item name="android:windowTranslucentStatus">true</item>  // 透明状态栏
leve 21
1
2
<item name="android:windowDrawsSystemBarBackgrounds">true</item>                      // 是否需要系统栏背景
<item name="android:statusBarColor">#00000000 or @android:color/transparent</item> // 系统栏背景颜色

关于 leve 就是在对应的 value 文件夹下加入不同的代码如 values-19、 values-21 等这是我目前知道的窗口改动.

下面是窗口全透明也就是那个失败案例
1
<item name="android:windowIsTranslucent">true</item>  // 窗口全透明




—— END. ——