searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

AMS- Activity启动流程

2022-12-12 02:47:12
70
0

此流程是按照在应用程序中通过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的创建。
 
 
0条评论
0 / 1000