序言:今天老大让我去找UI要一张启动页的图,然后给项目加个启动页,放进去之后也没管那么多,后来运行项目的时候发现有点瑕疵,来看下图:
可能有人要问了,这不是挺好的一个欢迎界面吗?有啥问题,我相信看的仔细的看官会发现启动之后有一段时间是空白的,即使是很短,让人看着也不舒服,这时候可能又有人说了,那可能是你在application里面干了耗时的事才导致的,话说我一开始也是这样觉得的,然后我令写一个demo作测试,发现然而并不关你的application什么事儿,因为我都没有application,启动的时候依然有这样的问题,然后我就去对比我手机上腾讯公司和其他公司的产品,我发现他们的app大多是在你手指按下桌面图标的时候,先“静止”一段时间,然后再启动,而且中间一点白色的间隙也没有,这是什么鬼,带着疑惑,我去百度了一番,发现问题还真有:
后来我才之后,原来有冷热启动这一说:
1、冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。
特点:冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化application类,再创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。
2、热启动:当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动。
特点:热启动因为会从已有的进程中来启动,所以热启动就不会走application这步了,而是直接走MainActivity(包括一系列的测量、布局、绘制),所以热启动的过程只需要创建和初始化一个MainActivity就行了,而不必创建和初始化application,因为一个应用从新进程的创建到进程的销毁,application只会初始化一次。
既然上述问题不是出在application,那么肯定就是在Activity了,我是这么想的,然后我就想着是不是SetContentView的时候花了很多时间呢?然后我又测试了一遍:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
long startTime = System.currentTimeMillis();
setContentView(R.layout.activity_start);
Log.d(TAG, "time===" + (System.currentTimeMillis() - startTime));
}
然后打印出来的时间是:
哈,果真是setContentView导致的,那就很好解决了,我们不要setContentView就好了,可能还有人要问了,你不要setContentView你咋加载布局呢?别急,别忘了还有theme这个好东西啊!我们可以定义一个theme,然后给theme设置背景就好了:
<style name="StartTheme" parent="AppTheme">
<item name="android:windowBackground">@mipmap/icon_splash</item>
</style>
好了,大功告成,我们来看看效果:
注:setContentView的内部原理有兴趣的同学可以自己去百度看看,看看在哪里耗时了