(frameworks/base/core/java/android/app/Activity.java)
startActivity() {
----startActivityForResult() {
--------mInstrumentation.execStartActivity()
----}
}
(frameworks/base/core/java/android/app/Instrumentation.java)
execStartActivity() {
----ActivityManager.getService().startActivity()
}
ActivityManager.getService()返回的是个IActivityManager
ActivityManagerService/ActivityTaskManagerService继承了IActivityManager.Stub,
注意:这里其实就是 Luncher进程 与 AMS(SystemServer系统服务进程) 通过Binder跨进程通信,调用到了AMS内的startActivity()
(frameworks/base/core/java/android/server/am/ActivityManagerService.java)
startActivity() {
----startActivityAsUser() {
--------mActivityStarter.startActivityMayWait()
----}
}
(frameworks/base/core/java/android/server/am/ActivityStarter.java)
startActivityMayWait() {
----startActivity() {
--------startActivityUnchecked() {
-----------经过方法调用...进入ActivityStackSupervisor(Activity栈管理相关)
-----------经过方法调用...进入ActivityStack(Activity栈)
--------}
----}
}
(frameworks/base/core/java/android/server/am/ActivityStack.java)
resumeTopActivityInnerLocked() {
----mStackSupervisor.startSpecificActivityLocked()
}
最终会执行startSpecificActivityLocked()
(frameworks/base/core/java/android/server/am/ActivityStackSupervisor.java)
startSpecificActivityLocked() {
----if (要启动Activity的应用进程是否存在) {
--------realStartActivityLocked()
----} else {
--------//注意:AMS(系统服务进程)通过Socket跨进程请求 Zygote进程 fork出应用进程
--------mService.startProcessLocked()
----}
}
realStartActivityLocked() {
----app.thread.scheduleLauchActivity()
}
这里的app表示要启动的Activity所在的进程。app.thread是IApplicationThread类型,是AIDL文件,那么继续寻找,发现AcitvityThread的内部类ApplicationThread实现了IApplicationThread.Stub。
注意:这里其实就是 AMS(SystemServer系统服务进程) 与 应用进程 通过Binder跨进程通信,调用到了应用进程内AcitivtyThread的scheduleLaunchActivity()。
(frameworks/base/core/java/android/app/AcitivtyThread.java)
scheduleLaunchActivity() {
----sendMessage(H.LAUNCH_ACTIVITY, r);
}
这里调用了ActivityThread类内的sendMessage方法。该方法最终调用了内部Handler子类H的handleMessage方法。
注意:这里其实就是 Handler通信
(frameworks/base/core/java/android/app/AcitivtyThread.java)
private class H extends Handler {
----handleMessage() {
--------handleLaunchActivity() {
------------performLaunchActivity() {
----------------mInstrumentation.newActivity();// 调用Instrumenation的newActivity方法(其内通过ClassLoader创建Activity实例)创建Activity。
------------}
--------}
----}
}
总结:冷启动流程
- 1.点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;
- 2.system_server进程接收到请求后,向zygote进程发送创建进程的请求;
- 3.Zygote进程fork出新的子进程,即App进程;
- 4.App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
- 5.system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;
- 6.App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;
- 7.主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。
到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。