Android 四大组件之 Activity Record

一. 引言

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

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

  • 调用createActivityContext(),保存到ContextImpl.mActivityToken
  • 调用activity.attach(),保存到Activity.mToken;

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

  • 调用Service.attach(),保存到Service.mToken;
  • 用途:stopSelf,startForeground, stopForeground

二. ActivityRecord结构体

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

  • ActivityRecord: 记录着Activity信息
  • TaskRecord: 记录着task信息
  • ActivityStack: 栈信息

2.1 ActivityRecord

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

  • ProcessRecord app //跑在哪个进程
  • TaskRecord task //跑在哪个task
  • ActivityInfo info // Activity信息
  • int mActivityType //Activity类型
  • ActivityState state //Activity状态
  • ApplicationInfo appInfo //跑在哪个app
  • ComponentName realActivity //组件名
  • String packageName //包名
  • String processName //进程名
  • int launchMode //启动模式
  • int userId // 该Activity运行在哪个用户id

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

mActivityType:

  • APPLICATION_ACTIVITY_TYPE:普通应用类型
  • HOME_ACTIVITY_TYPE:桌面类型
  • RECENTS_ACTIVITY_TYPE:最近任务类型

ActivityState:

  • INITIALIZING
  • RESUMED:已恢复
  • PAUSING
  • PAUSED:已暂停
  • STOPPING
  • STOPPED:已停止
  • FINISHING
  • DESTROYING
  • DESTROYED:已销毁

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

时间点 赋值时间 含义
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对象.

top Created with Sketch.