Activity工作过程

主要类

类名 作用
Launcher 桌面应用程序
Intrumentation 与ActivityManagerNative 交互,控制Launcher与AMS的交互
ActivityManagerNative 进程间通信中Stub抽象类
ActivityManagerProxy 代理类
IActivityManager aidl接口
ActivityManagerService Android中核心服务,负责四大组件的调度、进程管理,继承自ActivityManagerNative,由Native中getDeafult提供单实例
ActivityStack 管理Activity栈结构的类
ActivityThread Application的主线程
ActivityThread.ApplicationThread 控制应用程序的Binder接口
ApplicationThreadProxy 控制应用程序的代理类
ActivityStackSupervisor 创建activity、application对象

启动流程

1.ActivityThread.startActivity

通过点击桌面或startActivity启动,无论是哪种方法均执行Activity类中 startActivityForResult,接着调用mInstrumentation.execStartActivity

2.Instrumentation.execStartActivity

通过ActivityManagerNative.getDefault()获取到ActivityMangerProxy对象,通过binder机制调用AMS中的startActivity()方法

3.ActivityManagerService.startActivity

startActivity调用startActivityAsUser

4.ActivityStackSupervisor.startActivityMayWait

对intent中传来的信息进行封装

5.ActivityStackSupervisor.startActivityLocked

保存调用进程信息,创建activityRecord

6.ActivityStackSupervisor.startActivityUnchekedLocked

7.ActivityStack.startActivityUnchecked

判断即将启动的Activity是否需要在新的task中进行创建和创建新的Task

8.ActivityStack.startActivityLocked

确保当前要开启的activity添加到新建的task的顶端。

9.ActivityStack.resumeTopActivityInnerLocked

通过调用ApplicationThreadProxy对象(Binder机制)将当前正在运行的LaunchActivity由Resumed状态转换为Paused状态,通过handler发送消息,ActivityThread接受到消息后调用onPause方法,并通过Binder机制告诉AMS

10.ActivityStackSupervisor.startSpecificActivityLocked

在AMS中创建进程,根据zygote的fork函数、socket通信,并在其中执行ActivityThread.main()方法

11.ActivityStackSupervisor.realStartActivityLocked

通过Binder机制(Proxy对象)向刚创建的进程发送消息,调用performLaunchActivity

12.ActivityThread.performLaunchActivity

创建activity对象cl.loadClass().newInstance()
创建application对象
创建contextImpl对象,并通过attach关联activity
调用onCreate方法