1、app 在启动activity 的时候都会调用 startActivity,看源码如下,从图1--->图3,最终调用了AMS的startActivity 方法。
然后会调用Instrumentation 中的 execStartActivity() 方法
2、调用回到AMS中,ActivityStarter 调用startActivityMayWait()方法
然后在调用ActivityStackSupervisor中的resumeFocusedStackTopActivityLocked
然后在调用ActivityStack 中的resumeTopActivityUncheckedLocked
在resumeTopActivityUncheckedLocked 中调用 ActivityStackSupervisor中的startSpecificActivityLocked 。
1、在这个方法中先判断application启动了没有,如果没有启动调用AMS中的 startProcessLocked,最后调用startProcessLocked()方法来创建新的进程。该方法会通过前面讲到的socket通道传递参数给Zygote进程。Zygote孵化自身。调用ZygoteInit.main()方法来实例化ActivityThread对象并最终返回新进程的pid。调用ActivityThread.main()方法,ActivityThread随后依次调用Looper.prepareLoop()和Looper.loop()来开启消息循环,这个就是Application 的启动流程,在bindApplication后,再次调用需要启动的activity。
2、如果app启动了,程序内调用则执行realStartActivityLocked(),下面具体看看内部是怎么调用的
3、看到scheduleLaunchActivity这个方法是不是豁然开朗,app.thread实际上就是ActivityThread.我们再看看这个方法
流程图:
总结:
1、Instrumentation对象到底起了什么作用,其实相当于是一个管家,涉及到Activity很多生命周期的操作都会通过Instrumentation。
2、启动一个Activity的时候会先执行当前Activity的onPause()方法,然后再去执行将要启动Activity的onCreate()的原因
3、在Activity执行完onResume()方法之后,调用makeVisible()方法,才会真正的把视图展示出来。