Android四大组件之Activity(三)—— Activity启动中涉及到的重要的数据结构,ActivityRecord等

本文详细探讨了Android系统中ActivityRecord、TaskRecord、ActivityStack等相关数据结构,阐述它们在Activity启动过程中的作用。ActivityRecord存储了Activity的所有信息,TaskRecord代表任务栈,ActivityStack则管理TaskRecord。同时,文中还提到了ActivityDisplay、ActivityStackSupervisor、ProcessRecord和UserId在Android系统中的角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 =<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值