1、使用的是Android 7.1.2的源代码:
https://pan.baidu.com/s/1XcVD68cC_2wKtm8jJkdNQA
przv
2、感谢IT先森的系列博客:
Android应用进程创建流程大揭秘
Android四大组件之bindService源码实现详解
Android四大组件之Activity启动流程源码实现详解概要
Activity启动流程(一)发起端进程请求启动目标Activity
Activity启动流程(二)system_server进程处理启动Activity请求
Activity启动流程(三)-Activity Task调度算法复盘分析
Activity启动流程(四)-Pause前台显示Activity,Resume目标Activity
Activity启动流程(五)请求并创建目标Activity进程
Activity启动流程(六)注册目标Activity进程到system_server进程以及创建目标Activity进程Application
Activity启动流程(七)初始化目标Activity并执行相关生命周期流程
涉及到的数据结构的关系:
正向关系链表:
ActivityStackSupervisor.mActivityDisplays
---> ActivityDisplay.mStacks
---> ActivityStack.mTaskHistory
---> TaskRecord.mActivities
---> ActivityRecord
反向关系链表:
ActivityRecord.task
---> TaskRecord.stack
---> ActivityStack.mStackSupervisor
---> ActivityStackSupervisor
1、ActivityRecord
-
ActivityRecord是AMS中保存activity信息的数据结构,ActivityRecord中存在着大量的成员变量,包含了一个Activity的所有信息,如所在的进程名、应用的包名、所在的任务栈的taskAffinity等。
-
ActivityInfo是写死的,是对AndroidManifest.xml的完全解析的呈现,而ActivityRecord是根据发起端进程创建目标Activity传入的参数等情况确定的。
//ActivityRecord
final class ActivityRecord {
/*表示AMS在创建ActivityRecord时候指定*/
final ActivityManagerService service;
/*这个是和WindowMangerService通信的,该值会赋值给Activity中*/
final IApplicationToken.Stub appToken;
/*这个描述是AndroidManifest.xml中定义activity相关信息*/
final ActivityInfo info;
/*这个描述是AndroidManifest.xml中定义application相关信息*/
final ApplicationInfo appInfo;
...
/*应用的包名*/
final String packageName;
final String processName;
/**Activity亲和性,简单的描述就是该Activity应属于是哪个Task*/
final String taskAffinity;
...
/**以下三个表示该Activity类型*/
static final int APPLICATION_ACTIVITY_TYPE= 0;
static final int HOME_ACTIVITY_TYPE = 1;
static final int RECENTS_ACTIVITY_TYPE = 2;
int mActivityType;
...
/**Activity属于哪个Task*/
TaskRecord task;
/**通过startActivityForResult启动时,接收返回值的Activity*/
ActivityRecord resultTo;
/**通过startActivityForResult启动时设置的requestCode*/
final int requestCode;
...
/*Activity所属的进程*/
ProcessRecord app;
/*表示Activity的当前状态, INITIALIZING,RESUMED,PAUSING,PAUSED,STOPPING,STOPPED,FINISHING,DESTROYING,DESTROYED
有这几种状态*/
ActivityState state;
/*标记是否为Task的root Activity,比如每个应用有一个mainActivity,一般
*情况下该main Activity即为对应Task的rootActivity*/
boolean frontOfTask;
/*标记该ActivityRecord是否已经stoped*/
boolean stopped;
/*标记ActivityRecord是否已经finishing,这在activity finish时置为true*/
boolean finishing;
boolean deferRelaunchUntilPaused;
boolean visible;
boolean sleeping;
boolean nowVisible;
/*ActivityStack管理类*/
final ActivityStackSupervisormStackSupervisor;
ActivityRecord(ActivityManagerService _service, ProcessRecord _caller,
int _launchedFromUid, String _launchedFromPackage, Intent _intent, String _resolvedType,
ActivityInfo aInfo, Configuration _configuration,
ActivityRecord _resultTo, String _resultWho, int _reqCode,
boolean _componentSpecified, boolean _rootVoiceInteraction,
ActivityStackSupervisor supervisor,
ActivityContainer container, ActivityOptions options, ActivityRecord sourceRecord) {
...
appToken = new Token(this, service);//注意此处的Token是一个匿名Binder,既然是Binder就可以跨进程传输了
state =<