record是什么意思

更新时间:2022-11-24 17:40:44 阅读: 评论:0


2022年11月24日发(作者:passion是什么意思)

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

finalArrayListmActivities;//使⽤⼀个ArrayList来保存所有的ActivityRecord

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/

classActivityStackextendsConfigurationContainerimplementsStackWindowListener{

privatefinalArrayListmTaskHistory=newArrayList<>();//使⽤⼀个ArrayList来保存TaskRecord

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小时内删除。

下一篇:safely
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图