Activity启动模式之详解ActivityRecord、TaskRecord、Acti。
。。
本⽂⽬的在于作为充分理解activity启动模式之前的铺垫和对⼀些常⽤概念的深⼊理解。
通常我们在说activity启动模式的时候会说到activity栈,任务栈,activity任务栈等词语,但是如果细问这些名词的代表着什
么?以什么表现形式出现?或许我们就会⽀⽀吾吾没有⼀个详细的概念,看完本⽂你就会对activity栈,任务栈这些概念有⼀个更深⼊
的了解,也可以更好的帮助学习后续的activity启动模式。
⽬录
1.简介
先上⼀个ActivityRecord、TaskRecord、ActivityStack三者的关系图。
2.名词解析
⼀个ActivityRecord对应⼀个Activity,保存了⼀个Activity的所有信息;但是⼀个Activity可能会有多个ActivityRecord,因为Activity
可以被多次启动,这个主要取决于其启动模式。
⼀个TaskRecord由⼀个或者多个ActivityRecord组成,这就是我们常说的任务栈或者Task栈,具有后进先出的栈特征。
ActivityStack则是⽤来管理TaskRecord的,包含了⼀个或者多个TaskRecord,具有后进先出的栈特征。
AMS初始化时会创建⼀个ActivityStackSupervisor对象统⼀创建和管理各应⽤的ActivityStack即Activity栈。
AMS对于activity的管理主要通过三种数据结构ActivityStack,TaskRecord,ActivityRecord,前两种数据结构均遵循后进先出的栈
结构。
三者关系是:ActivityStack包含TaskRecord,TaskRecord包含ActivityRecord。
2.1ActivityRecord
即Activity在Activity栈中的存储形式,包含了⼀个Activity所有的信息,存放于TaskRecord中的Arraylist集合中。
frameworks/ba/rvices/core/java/com/android/rver/am/
finalclassActivityRecordextendsConfigurationContainerimplementsAppWindowContainerListener{
finalActivityManagerServicervice;//owner
pToken;//windowmanagertoken
AppWindowContainerControllermWindowContainerController;
finalActivityInfoinfo;//allaboutme
finalApplicationInfoappInfo;//informationaboutactivity'sapp
//省略其他成员变量
//ActivityRecord所在的TaskRecord,ActivityRecord通过此变量与所属Task栈建⽴联系
privateTaskRecordtask;//thetaskthisisin.
//构造⽅法,需要传递⼤量信息
ActivityRecord(ActivityManagerService_rvice,ProcessRecord_caller,int_launchedFromPid,
int_launchedFromUid,String_launchedFromPackage,Intent_intent,String_resolvedType,
ActivityInfoaInfo,Configuration_configuration,
tyRecord_resultTo,String_resultWho,int_reqCode,
boolean_componentSpecified,boolean_rootVoiceInteraction,
ActivityStackSupervisorsupervisor,ActivityOptionsoptions,
tyRecordsourceRecord){
}
}
startActivity()时会创建⼀个ActivityRecord:
frameworks/ba/rvices/core/java/com/android/rver/am/
classActivityStarter{
privateintstartActivity(IApplicationThreadcaller,Intentintent,IntentephemeralIntent,
StringresolvedType,ActivityInfoaInfo,ResolveInforInfo,
IVoiceInteractionSessionvoiceSession,IVoiceInteractorvoiceInteractor,
IBinderresultTo,StringresultWho,intrequestCode,intcallingPid,intcallingUid,
StringcallingPackage,intrealCallingPid,intrealCallingUid,intstartFlags,
ActivityOptionsoptions,booleanignoreTargetSecurity,booleancomponentSpecified,
tyRecord[]outActivity,TaskRecordinTask){
//其他代码略
ActivityRecordr=newActivityRecord(mService,callerApp,callingPid,callingUid,
callingPackage,intent,resolvedType,aInfo,balConfiguration(),
resultRecord,resultWho,requestCode,componentSpecified,voiceSession!=null,
mSupervisor,options,sourceRecord);
//其他代码略
}
}
2.2TaskRecord
即常说的任务栈、Task栈,存放于ActivityStack中的Arraylist集合中,设计⽬的是针对某⼀个功能或操作所涉及到的⼀系列
Activity的集合,即将⼀系列功能关联的Activity通过Task的概念来统⼀存放和标识,也是四种启动模式中所针对的Task概念。
frameworks/ba/rvices/core/java/com/android/rver/am/
finalclassTaskRecordextendsConfigurationContainerimplementsTaskWindowContainerListener{
finalinttaskId;//任务ID
finalArrayList
privateActivityStackmStack;//TaskRecord所在的ActivityStack
//构造⽅法
TaskRecord(ActivityManagerServicervice,int_taskId,ActivityInfoinfo,Intent_intent,
IVoiceInteractionSession_voiceSession,IVoiceInteractor_voiceInteractor,inttype){
}
//添加Activity到顶部
voidaddActivityToTop(tyRecordr){
addActivityAtIndex((),r);
}
//添加Activity到指定的索引位置
voidaddActivityAtIndex(intindex,ActivityRecordr){
//...
k(this);//为ActivityRecord设置TaskRecord,就是这⾥建⽴的联系
//...
index=(size,index);
(index,r);//添加到mActivities
//...
}
//其他代码略
}
startActivity()时也可能会创建⼀个TaskRecord:
frameworks/ba/rvices/core/java/com/android/rver/am/
classActivityStarter{
privateinttTaskFromReuOrCreateNewTask(TaskRecordtaskToAffiliate,intpreferredLaunchStackId,ActivityStacktopStack){
mTargetStack=computeStackFocus(mStartActivity,true,mLaunchBounds,mLaunchFlags,mOptions);
if(mReuTask==null){
//创建⼀个createTaskRecord,实际上是调⽤ActivityStack⾥⾯的createTaskRecord()⽅法,ActivityStack下⾯会讲到
finalTaskRecordtask=TaskRecord(
tTaskIdForUrLocked(),
mNewTaskInfo!=null?mNewTaskInfo:,
mNewTaskIntent!=null?mNewTaskIntent:mIntent,mVoiceSession,
mVoiceInteractor,!mLaunchTaskBehind/*toTop*/,ityType);
//其他代码略
}
}
}
2.3ActivityStack
字⾯意思就是Activity栈,对应⼀个应⽤的activity栈,⼤部分使⽤中分为Launcher相关的activity栈和⾮Launcher相关的activity
栈两种类型;
ActivityStack中持有ActivityStackSupervisor对象。ActivityStack是由ActivityStackSupervisor来创建的,AMS初始化时会
创建⼀个ActivityStackSupervisor对象统⼀创建和管理各应⽤的ActivityStack。
frameworks/ba/rvices/core/java/com/android/rver/am/
classActivityStack
privatefinalArrayList
finalintmStackId;
protectedfinalActivityStackSupervisormStackSupervisor;//持有⼀个ActivityStackSupervisor,所有的运⾏中的ActivityStacks都通过它来进⾏管理
//构造⽅法
ActivityStack(tyDisplaydisplay,intstackId,
ActivityStackSupervisorsupervisor,RecentTasksrecentTasks,booleanonTop){
}
TaskRecordcreateTaskRecord(inttaskId,ActivityInfoinfo,Intentintent,
IVoiceInteractionSessionvoiceSession,IVoiceInteractorvoiceInteractor,
booleantoTop,inttype){
//创建⼀个task
TaskRecordtask=newTaskRecord(mService,taskId,info,intent,voiceSession,voiceInteractor,type);
//将task添加到ActivityStack中去
addTask(task,toTop,"createTaskRecord");
//其他代码略
returntask;
}
//添加Task
voidaddTask(finalTaskRecordtask,finalbooleantoTop,Stringreason){
addTask(task,toTop?MAX_VALUE:0,true/*schedulePictureInPictureModeChange*/,reason);
//其他代码略
}
//添加Task到指定位置
voidaddTask(finalTaskRecordtask,intposition,booleanschedulePictureInPictureModeChange,
Stringreason){
(task);//若存在,先移除
//...
(position,task);//添加task到mTaskHistory
ck(this);//为TaskRecord设置ActivityStack
//...
}
//其他代码略
}
2.4ActivityStackSupervisor
AMS初始化时会创建⼀个ActivityStackSupervisor对象,所有的运⾏中的ActivityStack都通过它来进⾏管理。
ActivityStackSupervisor内部有两个不同的ActivityStack对象:mHomeStack、mFocudStack,⽤来管理不同的任务。
frameworks/ba/rvices/core/java/com/android/rver/am/
publicclassActivityStackSupervisorextendsConfigurationContainerimplementsDisplayListener{
ActivityStackmHomeStack;//管理的是Launcher相关的任务
ActivityStackmFocudStack;//管理⾮Launcher相关的任务
//创建ActivityStack
ActivityStackcreateStack(intstackId,tyDisplaydisplay,booleanonTop){
switch(stackId){
caPINNED_STACK_ID:
//PinnedActivityStack是ActivityStack的⼦类
returnnewPinnedActivityStack(display,stackId,this,mRecentTasks,onTop);
default:
//创建⼀个ActivityStack
returnnewActivityStack(display,stackId,this,mRecentTasks,onTop);
}
}
}
3.总结
Android的Activity管理和关系
AMS初始化时会创建⼀个ActivityStackSupervisor对象,ActivityStackSupervisor创建和管理Android系统中所有应⽤的
ActivityStack(应⽤的Activity栈),⼀个ActivityStack对应和包含⼀个应⽤所启动的所有activity,⼀个ActivityStack包含⼀或多个
TaskRecord(Task栈、任务栈,Activity启动模式中所说的栈,将⼀系列功能关联的Activity通过Task的概念来统⼀存放和标识),⼀个
TaskRecord包含⼀到多个ActivityRecord(包含Activity所有信息)。
应⽤销毁流程
⼀次back键(未重写onBackPresd的情况下)或者显式调⽤finish⽅法,系统会从前台应⽤ActivityStack中的顶部Task中的顶
部的Activity出栈并销毁,如果出栈后Task中不包含任何Activity,那么让当前Task从对应的ActivityStack出栈并销毁当前Task,如果销
毁Task后当前ActivityStack不包含任何Task,那么销毁当前Stack,意味着应⽤被销毁。
任务栈查看命令
adbshelldumpsysactivityactivities(详细,⼏乎可以看到Activity栈所有信息)
adbshellamstacklist(粗略,只能得到Activity栈的基本信息)
后续会详细讲解Activity的启动模式,请持续关注。
本文发布于:2022-11-24 17:40:44,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/13285.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |