https://blog.csdn.net/wenyiqingnianiii/article/details/52338339
点击一个图标后:
图标---startactivity方法--activitymanagerservice--activityrecord入栈--通知amsonpause了
ams通过new task的flag开启新进程,调用startprocess方法--ams反射调用activitythread的main方法--调用prepare loop--通知ams启动了--ams回调handlelauncheractivity加载activity---并反射调用application oncreate和activity的oncreate--handlerecumeactivity中反射调用activity的onresume方法。
详细:
点击图标后通过startActivity远程调用到ams中,ams中将新启动的activity以activityrecord的结构压入activity栈中,并通过远程binder回调到原进程,使得原进程进入pause状态,原进程pause后通知ams我pause了。ams再根据栈中activity的启动intent中的flag是否含有new_task的标签判断是否需要启动新进程,启动新进程通过startProcessXXX的函数。启动新进程后通过反射调用ActivityThread的main函数,main函数中调用looper.prepar和lopper.loop启动消息队列循环机制。最后远程告知ams我启动了。ams回调handleLauncherAcitivyt加载activity。在handlerLauncherActivity中会通过反射调用Application的onCreate和activity的onCreate以及通过handleResumeActivity中反射调用activity的onresume。一个应用就此启动。