冷启动 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。