Android面试知识Android面试题笔记

ActivityRecord、TaskRecord、Activi

2018-06-25  本文已影响8人  ab64fd4eaee3

https://blog.csdn.net/kebelzc24/article/details/53747506

http://www.cnblogs.com/bastard/archive/2012/04/07/2436262.html

本文基于Android 7.0

每一个ActivityRecord都会有一个Activity与之对应,一个Activity可能会有多个ActivityRecord,因为Activity可以被多次实例化,取决于其launchmode。一系列相关的ActivityRecord组成了一个TaskRecord,TaskRecord是存在于ActivityStack中,ActivityStackSupervisor是用来管理这些ActivityStack的。

下面是一个简单的关系图

image

http://gityuan.com/2017/06/11/activity_record/

可以看到一个ActivityStack可以包含很多个TaskRecord,一个TaskRecord又可以包含很多个ActivityRecord。

下面看下ActivityRecord、TaskRecord、ActivityStack数据结构

image.png image.png image.png image.png

一. 引言

BroadcastRecord,ServiceRecord都继承于Binder对象,而ActivityRecord并没有继承于Binder。 但ActivityRecord的成员变量appToken的数据类型为Token,Token继承于IApplicationToken.Stub。

appToken:system_server进程通过调用scheduleLaunchActivity()将appToken传递到App进程,

ServiceRecord本身继承于Binder对象,传递到客户端的代理:

二. ActivityRecord结构体

先以一幅图来展示AMS管理Activity所涉及的相关数据结构: 点击查看大图

activity_record

2.1 ActivityRecord

Activity的信息记录在ActivityRecord对象, 并通过通过成员变量task指向TaskRecord

再来说一说Activity类型和Activity状态的常量:

mActivityType:

ActivityState:

最后,说一说时间相关的成员变量:

时间点 赋值时间 含义
createTime new ActivityRecord Activity首次创建时间点
displayStartTime AS.setLaunchTime Activity首次启动时间点
fullyDrawnStartTime AS.setLaunchTime Activity首次启动时间点
startTime Activity上次启动的时间点
lastVisibleTime AR.windowsVisibleLocked Activity上次成为可见的时间点
cpuTimeAtResume AS.completeResumeLocked 从Rsume以来的cpu使用时长
pauseTime AS.startPausingLocked Activity上次暂停的时间点
launchTickTime AR.startLaunchTickingLocked Eng版本才赋值
lastLaunchTime ASS.realStartActivityLocked 上一次启动时间

其中AR是指ActivityRecord, AS是指ActivityStack。

2.2 TaskRecord

Task的信息记录在TaskRecord对象.

2.3 ActivityStack

所有前台stack的mResumedActivity的state == RESUMED, 则表示allResumedActivitiesComplete, 此时mLastFocusedStack = mFocusedStack;

2.4 ActivityStackSupervisor

home的栈ID等于0,即HOME_STACK_ID = 0;

三. Activity栈关系

3.1 Stack组成图

Activity栈结构体的组成关系,点击查看大图

ams_relations

(1)正向关系链表:

ActivityStackSupervisor.mActivityDisplays 
-> ActivityDisplay.mStacks 
-> ActivityStack.mTaskHistory 
-> TaskRecord.mActivities 
-> ActivityRecord

(2)反向关系链表:

ActivityRecord.task 
-> TaskRecord.stack 
-> ActivityStack.mStackSupervisor
-> ActivityStackSupervisor

注:ActivityStack.mDisplayId可找到所对应的ActivityDisplay;

四. 启动过程

Activity启动与停止流程,点击查看大图

Seq_activity

Activity的pause情况:

Activity的stop情况:

上一篇下一篇

猜你喜欢

热点阅读