引言
Activity启动流程很多文章都已经说过了,这里说一下自己的理解。
涉及到的概念
- 进程:Android系统中每个APP都是一个进程
- IPC:跨进程通信
涉及到的类
- ActivityStack:Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。
- ActivitySupervisor:管理activity任务栈
- ActivityThread:UI线程,App的真正入口。
- ApplicationThread:用来实现AMS和ActivityThread之间的交互。
- ApplicationThreadProxy:ApplicationThread在服务端的代理。AMS就是通过该代理与ActivityThread进行通信的。
- AMS:负责管理四大组件和进程,包括生命周期和状态切换。AMS因为要和ui交互,所以极其复杂,涉及window。
- AMN:运行在server端(SystemServer进程)。实现了Binder类,具体功能由子类AMS实现。
- AMP:AMS的client端代理(app进程)。了解Binder知识可以比较容易理解server端的stub和client端的proxy。AMP和AMS通过Binder通信。
- Instrumentation:仪表盘,负责调用Activity和Application生命周期。
流程图
涉及到的进程
- Launcher所在的进程
- AMS所在的SystemServer进程
- 要启动的Activity所在的app进程
具体流程
- Launcher:Launcher通知AMS要启动activity。
- startActivitySafely->startActivity->Instrumentation.execStartActivity()(AMP.startActivity)->AMS.startActivity
- AMS:PMS的resoveIntent验证要启动activity是否匹配。
- 如果匹配,通过ApplicationThread发消息给Launcher所在的主线程,暂停当前Activity(Launcher);
- 暂停完,在该activity还不可见时,通知AMS,根据要启动的Activity配置ActivityStack。然后判断要启动的Activity进程是否存在?
- 存在:发送消息LAUNCH_ACTIVITY给需要启动的Activity主线程,执行handleLaunchActivity
- 不存在:通过socket向zygote请求创建进程。进程启动后,ActivityThread.attach
- 判断Application是否存在,若不存在,通过LoadApk.makeApplication创建一个。在主线程中通过thread.attach方法来关联ApplicationThread。
- 在通过ActivityStackSupervisor来获取当前需要显示的ActivityStack。
- 继续通过ApplicationThread来发送消息给主线程的Handler来启动Activity(handleLaunchActivity)。
- handleLauchActivity:调用了performLauchActivity,里边Instrumentation生成了新的activity对象,继续调用activity生命周期。
参考函数流程
Activity启动流程(从Launcher开始):
Step1~Step5: Step1-Step5通知ActivityManagerService要启动新的Activity了(在Launcher所在进程执行)。
- Step1: Launcher.startActivitySafely
- Step2:Activity.startActivity
- Step3:Activity.startActivityForResult
- Step4:Instrumentation.execStartActivity
- Step5:ActivityManagerProxy.startActivity
Step6~Step12: Step6-Step12通知Launcher程序应该pause Launcher的Activity了(在ActivityManagerService所在进程执行)
- step6:ActivityManagerService.startActivity
- step7:ActivityStack.startActivityMayWait
- step8:ActivityStack.startActivityLocked :检查有没有在AndroidManifest中注册
- step9:ActivityStack.startActivityUncheckedLocked, ActivityStack.startActivityLocked :startActivityUncheckedLocked判断是否需要创建一个新的任务来启动Activity。
- step10:ActivityStack.resumeTopActivityLocked :获取栈顶的activity,并通知Launcher应该pause掉这个Activity以便启动新的activity
- step11:ActivityStack.startPausingLocked
- Step 12. ApplicationThreadProxy.schedulePauseActivity
Step13~Step17: pause Launcher的Activity,并通知ActivityManagerService已经pause结束了(在Launcher所在进程执行)
- step13:ApplicationThread.schedulePauseActivity
- step14:ActivityThread.queueOrSendMessage
- step15:H.handleMessage
- step16:ActivityThread.handlePauseActivity
- step17:ActivityManagerProxy.activityPaused
Step18~Step23 创建一个新进程,调用ActivityThread.main方法(执行在ActivityManagerService进程)
- step18:ActivityManagerService.activityPaused
- step19:ActivityStack.activityPaused
- step20:ActivityStack.completePauseLocked
- step21:ActivityStack.resumeTopActivityLocked
- step22;ActivityStack.startSpecificActivityLocked
- step23:ActivityManagerService.startProcessLocked
step18-step23:创建一个新进程,调用ActivityThread.main方法(执行在ActivityManagerService进程)。这其中,ActivityManagerService会先检查目标Activity所需的应用进程是否存在,如果存在,就直接通知这个进程,在该进程中启动Activity,否则,会先调用Process.start创建一个新的应用程序进程。
注:这里就是与在同一个进程中启动Activity的区别之处
Step24~Step25: 创建ActivityThread实例,初始化一些数据,进入Loop循环(执行在新创建的进程)
- step24:ActivityThread.main
- step25:ActivityManagerProxy.attachApplication
Step26~Step29: 处理新的应用进程发出的创建进程完成的通信请求,并通知新应用程序进程启动目标Activity组件(执行在ActivityManagerService进程)
- step26:ActivityManagerService.attachApplication
step27:ActivityManagerService.attachApplicationLocked - step28:ActivityStack.realStartActivityLocked
- step29:ApplicationThreadProxy.scheduleLaunchActivity
Step30~Step35: 加载MainActivity类,调用onCreate声明周期方法(执行在新进程)
- step30:ApplicationThread.scheduleLaunchActivity
- step31:ActivityThread.queueOrSendMessage
- step32:H.handleMessage
- step33:ActivityThread.handleLaunchActivity
- step34:ActivityThread.performLaunchActivity
- step35:MainActivity.onCreate
参考文章
http://gityuan.com/2016/03/12/start-activity/
https://blog.csdn.net/luoshengyang/article/details/6689748
网友评论