此流程是按照在应用程序中通过startActivity来启动一个应用程序,例如如下这种方式启动一个activity
Intent intent = new Intent("com.seewo.testA");
this.startActivity(intent);
Activity启动流程上半部分:
这张图里面涉及的几个关键的数据结构,包括如下:
Activity
ActivityRecord
TaskRecord
ActivityStack
ActivityStackSupervisor
先看一个总体的uml 数据之间的引用图
ActivityRecord
是最小的activity记录,里面只包含一个activity,在activity.java代码里面我们可以看到如下注释:
An entry in the history stack, representing an activity
activity的主要类型包括:
mActivityType: ACTIVITY_TYPE_STANDARD:标准应用类型 ACTIVITY_TYPE_HOME:桌面类型 ACTIVITY_TYPE_RECENTS:最近任务类型
activity的状态包括:
INITIALIZING RESUMED:已恢复 PAUSING PAUSED:已暂停 STOPPING STOPPED:已停止 FINISHING DESTROYING DESTROYED:已销毁
部分关键的数据字段说明:
ActivityTaskManagerService mAtmService //owner
IApplicationToken.Stub appToken; // window manager token
TaskRecord task //跑在哪个task
ActivityInfo info // Activity信息
ActivityState mstate //Activity状态
ApplicationInfo appInfo //跑在哪个app
ComponentName mActivityComponent//组件名
String packageName //包名
String processName //进程名
TaskRecord
TaskRecord 里面可以包括多个activityRecord,主要用来管理activity的使用,比如activity的加入和移除等
部分关键数据字段说明:
ActivityStack mStack; //TaskRecord所在的ActivityStack
ArrayList mActivities; // 使用一个ArrayList来保存当前task所有的 ActivityRecord
int taskId //任务ID
String affinity; 是指root activity的affinity,即该Task中第一个Activity;
int mCallingUid;// For relaunching the task from recents as though it was launched by the original launcher.
String mCallingPackage; //调用者的包名
//添加Activity到顶部
void addActivityToTop(com.android.server.am.ActivityRecord r) {
addActivityAtIndex(mActivities.size(), r);
}
//添加Activity到指定的索引位置
void addActivityAtIndex(int index, ActivityRecord r) {
//...
r.setTask(this);//为ActivityRecord设置TaskRecord,就是这里建立的联系
index = Math.min(size, index);
mActivities.add(index, r);//添加到mActivities
//...
}
ActivityStack
ActivityStack 是用来管理taskRecord的,负责taskRecord添加和删掉等,一般系统中只有2个ActivityStack对象。
部分关键字段说明:
ArrayList mTaskHistory //使用一个ArrayList来保存TaskRecord final
int mStackId;
ActivityStackSupervisor mStackSupervisor;//Run all ActivityStacks through this
int mDisplayId; //The attached Display's unique identifier, or -1 if detached
ActivityRecord mPausingActivity //正在pause
ActivityRecord mLastPausedActivity
ActivityRecord mResumedActivity //已经resumed
ActivityRecord mLastStartedActivity
TaskRecord createTaskRecord(int taskId, ActivityInfo info, Intent intent...) {
//创建一个task
TaskRecord task = new TaskRecord(mService, taskId, info, intent, voiceSession, voiceInteractor, type);
//将task添加到ActivityStack中去
addTask(task, toTop, "createTaskRecord"); }
//添加Task
void addTask(final TaskRecord task, final boolean toTop, String reason)
//添加Task到指定位置
void addTask(int position...)
上面各个record之间的启动关系:
ActivityStackSupervisor
顾名思义,ActivityStackSupervisor 就是用ActivityStack的管理者,它算是一个超级管理者,一般的,整个系统中就只有一个ActivityStackSupervisor 对象
部分关键字段说明:
RecentTasks mRecentTasks//最近历史任务
RunningTasks mRunningTasks//运行中的task
ActivityRecord mPausingActivity //正在pause
ActivityRecord mLastPausedActivity
ActivityRecord mResumedActivity //已经resumed
ActivityRecord mLastStartedActivity
整体的包含关系如下:
Activity 启动流程下半部分:
启动流程的下半部分主要包括zygote ,在zygote中会有一个socket消息接收端,那边在接收到上半部分发的socket消息之后,在接收到
相应的消息之后会进行解析,当接受到创建新activity进程时,通过fork来创建activity的进程,而activity的进程的主体是ActivityThread,
ActivityThread 会通过attach绑定对应的activity,完成整个activity的创建。