在前面我分享过activity的启动的过程,主要针对内部的调用startActivity。现在分享Application启动之后,是如何启动应用程序中的 第一个Activity (基于Android 8.0 系统 ) Application启动过程我分享过 。
1、来看看AMS的源码:标示1我分享过,标示2是今天需要分享的
2、调用ActivityStackSupervisor中的attachApplicationLocked,如下:
3、在realStartActivityLocked 有调用,如图:
4、这样我们的Activity 就创建起来啦
总结:①system_server进程中调用startProcessLocked方法,该方法最终通过socket方式,将需要创建新进程的消息告知Zygote进程,并阻塞等待Socket返回新创建进程的pid;
②Zygote进程接收到system_server发送过来的消息, 则通过fork的方法,将zygote自身进程复制生成新的进程,并将ActivityThread相关的资源加载到新进程app process,这个进程可能是用于承载activity等组件;
③ 在新进程app process向servicemanager查询system_server进程中binder服务端AMS, 获取相对应的Client端,也就是AMP. 有了这一对binder c/s对, 那么app process便可以通过binder向跨进程system_server发送请求,即attachApplication()
④system_server进程接收到相应binder操作后,经过多次调用,利用ATP向app process发送binder请求, 即bindApplication.
system_server拥有ATP/AMS, 每一个新创建的进程都会有一个相应的AT/AMP,从而可以跨进程 进行相互通信. 这便是进程创建过程的完整生态链。
当我们点击桌面的Launcher首次进入app时,会走Activity的startActivity()的过程,在启动一个新的Activity之前,会先执行“当前Activity”的onPause()方法,把当前Activity给pause掉(这里需要提一点,如果是点击桌面Launcher,首次进入app的话,这个“当前的Activity”指的就是桌面Launcher的Activity),当前Activity执行onPause()之后,如果当前应用的进程已经创建(这种情况下指的是在App内部的activity的跳转),那么就会去通过ActivityManagerService中持有的ActivityThread中的ApplicationThread这个Binder对象来立即创建一个新的Activity,并执行该Activity声明周期的方法,如果当前应用的进程没有创建(也就是首次进入app),那么这个时候会先通过Process.start()方法来创建一个进程,在创建的过程中会去调用ActivityThread的main()方法,在这个main()方法中会创建一些必备的东西比如,主线程的Looper等,并且在main()方法中会执行Application的创建过程,通过ActivityManagerService来创建一个Application,在创建完成之后,会启动一个Activity,这个Activity指的就是我们默认启动的首页Activity,也就是我们通常说的MainActivity。
---------------------