冷启动的概念
就是在启动应用之前,系统中没有该应用的任何进程信息.
冷启动和热启动的区别
上面讲了冷启动,那么什么是热启动呢?
热启动:用户点击了back或者home键退出app应用,下次再次重新启动该应用,热启动的应用是保留在后台的
这是热启动和冷启动在概念上的区别
现在随便写个demo,然后写个类去继承Application
package com.demoaapp; import android.app.Application; import android.util.Log; /** * Created by zhouguihzi on 2017/9/4. */ public class MyApp extends Application { private static final String TAG ="MyApp"; @Override public void onCreate() { super.onCreate(); Log.e(TAG,"app启动是冷启动"); try { Thread.sleep(6000); } catch (InterruptedException e) { e.printStackTrace(); } } }
现在跑起来,看看log以及现象.首先看下最近打开的app进程
然后我点击图标打开这个app:注意标题栏文字的变化
log信息:
那我现在退出这个app,然后再点击进来:
这个是热启动是不是MainActivity界面和标题栏瞬间就出来了,而不像冷启动那样要好久才出来,当然了是因为我在Application中做了一个线程休眠的时间,这是模拟一些放在application中的操作.
从上面的 分析也可以看的出热启动和冷启动的另外一个区别就是冷启动是走Application,而热启动时不走Application的
冷启动的时间计算
这个时间值是从应用启动(创建进程的时候)开始计算,到完成视图的第一次绘制(即Activity内容对用户可见)为止,这个其实不需要自己去算,你打开app的时候系统log就会有:
冷启动流程
1:系统会创建一个新的进程给app
2:创建并初始化Application以及SplashActivity或者MainActivity(反正是应用的第一个activity)
3:执行完成onCreate() onstart() onResume()三个方法
4:contentview会经历够measure,layout,draw过程然后把布局可见并显示出来
冷启动流程总结如下图:
知道了冷启动的流程,是不是想起来我们平时在SplashActivity中启动的时候黑屏的问题,这个主要和style有关.可以去查下怎么解决
冷启动的优化
1:减少onCreate()方法的工作量
2:不要在Application做相关业务的操作
3:不要在Application中做耗时的操作 比如IO操作
4:不要以静态变量的方式在Application中保存数据 易造成内存泄露 比如你写了一个获取屏幕宽和高的封装类,但是引用了activity,
5:减少UI层级