本文针对Activity的启动主线进行梳理。先捋大流程,后续再针对细节进行学习。
一、概览关键流程
![](https://img.haomeiwen.com/i2828107/317bf3565f0573f1.png)
启动流程关键主线梳理:
-
点击桌面App图标,Launcher进程采用Binder IPC向AMS发起startActivity请求;
-
AMS接收到请求后,向zygote进程发送创建进程的请求,由Zygote进程fork出新的子进程,即App进程;
-
App进程,通过Binder IPC向AMS发起attachApplication请求;
-
AMS在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;
-
App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;
-
主线程在收到Message后,创建目标Activity,并回调Activity.onCreate()等方法。
到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。
二、详细调用流程
下面再看看详细的Activity启动流程(包括top activity切换与activity stop过程) :
![](https://img.haomeiwen.com/i2828107/7b968f2491b9df09.jpeg)
Activity启动主要牵扯到两个进程 :app进程 与 system_server进程。按Binder IPC切换划分为如下几个节点:
-
app
触发activity的启动流程。
点击桌面App图标,Launcher进程采用Binder IPC向AMS发起startActivity请求。 -
system_server
接收activity启动请求,开始做一些前期准备工作。
- 获取对应Activity,并对基本信息进行验证。
- 根据launcheMode和Flag配置task。
- 如果之前存在前台Acitivity,则让它先进入pause状态。
-
app
让之前前台显示的activity进入pause状态。
这部分很简单,看流程图就足够。
4 system_server
进程准备。
ActivityStackSupervisor #startSpecificActivityLocked
判断当前要启动的activity所在的进程是否存在,如果不存在则创建进程。
5 app
ActivityThread 通过消息机制来处理Activity的Launch
6 system_server
activity stop时,调整task。
7 app
通知app执行stop回调。
三、执行流
-
Activity要通知系统进程
Activity-->Instrumentation-->ActivityManagerNative—>
Binder IPC 进入系统进程
-->ActivityManagerService-->ActivityStackSupervisor/ActivityStack -
系统进程要管理Activity
ApplicationThreadNative-->
Binder IPC 进入App进程
-->ActivityThread.ApplicationThread-->ActivityThread.H-->Instrumentation-->Activity -
Activity A 启动 Activity B
生命周期相关的整个过程是:a.onPause()-->b.onCreate()-->b.onStart()-->b.onResume()-->a.onStop()
从整个Activity流程看,主要能拆分为如下几个关键段:
- Activity的task/stack管理
- Zygote fork 进程的过程
- 应用层Activity启动流程
另外,starting Window流程也可以了解下。
先写这么多,后续慢慢总结。
网友评论