冷启动 vs 热启动

  • 冷启动
    • 后台没有该应用的进程
    • 重新创建一个新的进程
      • 先创建和初始化Application类
      • 再创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上
  • 热启动
    • 当应用已经被打开
    • 被按下返回键、Home键等按键时回到桌面或者是其他程序覆盖
    • 热启动的过程只需要创建和初始化一个MainActivity就行了,而不必创建和初始化Application
      • 直接走MainActivity(包括一系列的测量、布局、绘制)

冷启动流程

Application构造方法 –> attachBaseContext()–>onCreate –>Activity构造方法 –> onCreate() –> 配置主体中的背景等操作 –>onStart() –> onResume() –> 测量、布局、绘制显示

  • 点击app图标,从Zygote进程fork创建新进程给应用
    • 点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求
    • system_server进程接收到请求后,向zygote进程发送创建进程的请求;
    • Zygote进程fork出新的子进程,即App进程;
  • 依次创建和初始化Application类、创建MainActivity类、加载主题样式Theme中的windowBackground等属性设置给MainActivity以及配置Activity层级上的一些属性
    • App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
    • system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求
    • App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息
    • 主线程在收到Message后,通过反射机制创建目标Activity,并回调Activity.onCreate()等方法
    • 到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面

Activity启动流程

  • Activity1调用startActivity,实际会调用Instrumentation类的execStartActivity方法,Instrumentation是系统用来监控Activity运行的一个类,Activity的整个生命周期都有它的影子
  • 通过跨进程的binder调用,进入到ActivityManagerService中,其内部会处理Activity栈,通知Activity1 Pause,Activity1 执行Pause 后告知AMS
  • 在ActivityManagerService中的startProcessLocked中调用了Process.start()方法。并通过连接调用Zygote的native方法forkAndSpecialize,执行fork任务。之后再通过跨进程调用进入到Activity2所在的进程
  • ApplicationThread是一个binder对象,其运行在binder线程池中,内部包含一个H类,该类继承于类Handler。主线程发起bind Application,AMS 会做一些配置工作,然后让主线程 bind ApplicationThread,ApplicationThread将启动Activity2的信息通过H对象发送给主线程。发送的消息是EXECUTE_TRANSACTION,消息体是一个 ClientTransaction,即 LaunchActivityItem。主线程拿到Activity2的信息后,调用Instrumentation类的newActivity方法,其内通过ClassLoader创建Activity2实例
  • 通知Activity2去performCreate

注:现在发送的都是EXECUTE_TRANSACTION ,通过 TransactionExecutor 来执行 ClientTransaction, ClientTransaction 中包含各种 ClientTransactionItem,如 PauseActivityItem、LaunchActivityItem、StopActivityItem、ResumeActivityItem、DestroyActivityItem 等,这些Item的execute方法来处理相应的handle,如handlePauseActivity、handleLaunchActivity等,通知相应的Activity来perform。