(二十五) 冷启动和热启动

前言:这周去面试面试官有问到冷启动和热启动,额,之前补课是补到热更新,react native中有涉及,冷启动和热启动确实没了解过,写下博客了解一下。


参考博客: Android 冷启动 热启动 测试

demo:冷启动和热启动demo


补充:

1.测试启动时间shell命令:adb shell am start -W (包名/.类名)

比如:adb shell am start -W com.example.demo_21_custom_view/.MainActivity

2.执行成功后将返回三个测量到的时间: 

  • ThisTime:一般和TotalTime时间一样,除非在应用启动时开了一个透明的Activity预先处理一些事再显示出主Activity,这样将比TotalTime小。 
  • TotalTime:应用的启动时间,包括创建进程+Application初始化+Activity初始化到界面显示。 从我试验角度来看,如果进程和Application已经被初始化了,totaltime中的创建进程+Application初始化时间应该会忽略不计。
  • WaitTime:一般比TotalTime大点,包括系统影响的耗时。


1.冷启动热启动概念

  • 冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。
  • 热启动:当启动应用时,后台已有该应用的进程(例:按back键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动。


2. 测试冷启动热启动时间

2.1 冷启动

应用冷启动时间测试:将应用在最近任务中去除,然后再用shell命令调用起来,则可以测试冷启动时间。

可以看出冷启动应用经历的生命周期:

1.应用所属的application会走onCreate流程

2.主界面会走onCreate->onStart ->onResme流程


2.2 热启动

测试热启动时间则需要按返回键退出应用,回到桌面。

可以看出热启动应用经历的生命周期及与冷启动的异同:

1.应用所属的application“不会走”onCreate流程

2.主界面同样会走onCreate->onStart ->onResme流程

3.启动时间明显比冷启动少了很多

这说明了热启动相比冷启动耗费时间少主要少在application没有耗费时间重新创建。(其实还有省去了进程创建时间)


2.3 普通从后台恢复应用

还有一种额外情况是点击home键使应用隐藏于后台,应用的主界面没有经过onDestroy流程

可以看出与冷热启动经历的生命周期都不同,只是很简单的走如下流程:

onPause->onStop->onStart->onResume流程

启动时间则是最短的,因为activity都不需要重新创建。


3. 总结(摘抄自参考博客)

3.1 应用启动流程

在安卓系统上,应用在没有进程的情况下,应用的启动都是这样一个流程:当点击app的启动图标时,安卓系统会从Zygote进程中fork创建出一个新的进程分配给该应用,之后会依次创建和初始化Application类、创建MainActivity类、加载主题样式Theme中的windowBackground等属性设置给MainActivity以及配置Activity层级上的一些属性、再inflate布局、当onCreate/onStart/onResume方法都走完了后最后才进行contentView的measure/layout/draw显示在界面上,所以直到这里,应用的第一次启动才算完成,这时候我们看到的界面也就是所说的第一帧。

所以,总结一下,应用的启动流程如下:

Application的构造器方法——>attachBaseContext()——>onCreate()——>Activity的构造方法——>onCreate()——>配置主题中背景等属性——>onStart()——>onResume()——>测量布局绘制显示在界面上。

这块需要对activity启动有整体上的认识才行。


3.2 冷热启动特点

1、冷启动:冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化Application类,再创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。

2、热启动:热启动因为会从已有的进程中来启动,所以热启动就不会走Application这步了,而是直接走MainActivity(包括一系列的测量、布局、绘制),所以热启动的过程只需要创建和初始化一个MainActivity就行了,而不必创建和初始化Application,因为一个应用从新进程的创建到进程的销毁,Application只会初始化一次。

上面说的启动是点击app的启动图标来启动的,而另外一种方式是进入最近使用的列表界面来启动应用,这种不应该叫启动,应该叫恢复。




猜你喜欢

转载自blog.csdn.net/sinat_20059415/article/details/79942710