应用启动分为三种状态,每种状态都会影响到应用程序对用户的可见时间,分别是温启动、热启动、冷启动(谷歌在优化启动的时候也是主要针对于冷启动)
冷启动
冷启动是指应用程序(此处的应用程序是指我们的APP,后面一样)从头开始,系统的进程在此之前没有创建应用程序的进程,冷启动发生的时机就是首次启动APP的时间,是一个从无到有的状态 冷启动开始时,系统有三个任务:
- 加载并启动APP
- 启动后立即显示应用程序的空白启动窗口 (划重点,这个地方要优化的)
- 创建应用程序进程 创建完成了应用程序后,应用程序会负责下一阶段的任务
- 创建应用程序对象(application部分)
- 启动主线程
- 创建main activity(就是我们的第一个启动的页面)
- 加载试图
- 布局屏幕
- 执行初始化绘制
完成上述操作后,系统进程会交换当前显示的背景窗口,将其替换成main activity的页面,这个时候用户就可以进行操作了,下图是冷启动的直观表示
用户在看到页面完全展示出来的时机为main Activity的onResume的时候,那么我们就应该去考虑在此之前会存在哪些耗时的地方,首先是初始化的白屏、Application的onCreate(),再到main activity的onCreate()、onStart(),我们考虑这四个个地方
- 初始化时的白屏界面 在第一次打开APP的时候会出现一个白屏,这个我们可以去设置APP主题,更改其背景色或者更改背景图片来解决 -- 透明主题背景设置用下面的参数:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowFullscreen">true</item>
<item name="android:windowIsTranslucent">true</item>
</style>
-- 设置图片:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/app_action_img</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
</style>
- Application优化 正常开发我们要集成的那些第三方:定位、X5、友盟之类的,还有一些IO操作,或者是一些跨进程通信的,这些操作都会导致Application的onCreate方法中过多的耗时去进行这些操作,我们可以采用两种办法
- 按需初始化,如果不是非要在application中初始化的,就别放在onCreate中了
- 将初始化的一些操作放在异步线程中进行
- 第一个Activity优化 我们正常展示给用户看到的第一个Activity在onCreate与onStart中尽量不要去写过多的业务,能往后放放的就往后放放,第一个页面也不要太复杂,因为太复杂的页面,在渲染的时候会花费较多的时间
除去上面的两种视觉优化与代码优化外,还有一种方式:保活,大产商(QQ、微信、支付宝)很多都会去与手机产商合作,建立白名单,将应用加入白名单,让冷启动变成温启动
冷启动上面说了,那么温启动与热启动是个啥呢?普及一下
热启动
热启动比冷启动的开销更低,你的应用程序的活动依然保存在内存中,重新打开时避免了application的初始化,对象的初始化,界面的渲染(一般就我们点击back、home键之类的让程序处在后台)
温启动
温启动的开销比冷启动少,比热启动更多,温启动一般来说会有两种情况
- 用户已经退出你的应用(此时应用还在内存中),重新打开的时候还是需要走onCreate方法,也需要重新去创建活动,绘制界面
- 系统已经从内存中将你的应用kill了,当用户重新启动的时候,一切都和冷启动似的,但是任务可以从传递给onCreate()的已保存实例状态包中获取到
参考链接: 谷歌文档:developer.android.com/topic/perfo… blog.csdn.net/qq_22393017…